Intel® OpenMP* Runtime Library
 All Classes Functions Variables Typedefs Enumerations Enumerator Groups Pages
z_Windows_NT-586_util.c
1 /*
2  * z_Windows_NT-586_util.c -- platform specific routines.
3  */
4 
5 /* <copyright>
6  Copyright (c) 1997-2015 Intel Corporation. All Rights Reserved.
7 
8  Redistribution and use in source and binary forms, with or without
9  modification, are permitted provided that the following conditions
10  are met:
11 
12  * Redistributions of source code must retain the above copyright
13  notice, this list of conditions and the following disclaimer.
14  * Redistributions in binary form must reproduce the above copyright
15  notice, this list of conditions and the following disclaimer in the
16  documentation and/or other materials provided with the distribution.
17  * Neither the name of Intel Corporation nor the names of its
18  contributors may be used to endorse or promote products derived
19  from this software without specific prior written permission.
20 
21  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
24  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
25  HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32 
33 </copyright> */
34 
35 #include "kmp.h"
36 
37 #if (KMP_ARCH_X86 || KMP_ARCH_X86_64)
38 /* Only 32-bit "add-exchange" instruction on IA-32 architecture causes us to
39  * use compare_and_store for these routines
40  */
41 
42 kmp_int8
43 __kmp_test_then_or8( volatile kmp_int8 *p, kmp_int8 d )
44 {
45  kmp_int8 old_value, new_value;
46 
47  old_value = TCR_1( *p );
48  new_value = old_value | d;
49 
50  while ( ! __kmp_compare_and_store8 ( p, old_value, new_value ) )
51  {
52  KMP_CPU_PAUSE();
53  old_value = TCR_1( *p );
54  new_value = old_value | d;
55  }
56  return old_value;
57 }
58 
59 kmp_int8
60 __kmp_test_then_and8( volatile kmp_int8 *p, kmp_int8 d )
61 {
62  kmp_int8 old_value, new_value;
63 
64  old_value = TCR_1( *p );
65  new_value = old_value & d;
66 
67  while ( ! __kmp_compare_and_store8 ( p, old_value, new_value ) )
68  {
69  KMP_CPU_PAUSE();
70  old_value = TCR_1( *p );
71  new_value = old_value & d;
72  }
73  return old_value;
74 }
75 
76 kmp_int32
77 __kmp_test_then_or32( volatile kmp_int32 *p, kmp_int32 d )
78 {
79  kmp_int32 old_value, new_value;
80 
81  old_value = TCR_4( *p );
82  new_value = old_value | d;
83 
84  while ( ! __kmp_compare_and_store32 ( p, old_value, new_value ) )
85  {
86  KMP_CPU_PAUSE();
87  old_value = TCR_4( *p );
88  new_value = old_value | d;
89  }
90  return old_value;
91 }
92 
93 kmp_int32
94 __kmp_test_then_and32( volatile kmp_int32 *p, kmp_int32 d )
95 {
96  kmp_int32 old_value, new_value;
97 
98  old_value = TCR_4( *p );
99  new_value = old_value & d;
100 
101  while ( ! __kmp_compare_and_store32 ( p, old_value, new_value ) )
102  {
103  KMP_CPU_PAUSE();
104  old_value = TCR_4( *p );
105  new_value = old_value & d;
106  }
107  return old_value;
108 }
109 
110 kmp_int8
111 __kmp_test_then_add8( volatile kmp_int8 *p, kmp_int8 d )
112 {
113  kmp_int64 old_value, new_value;
114 
115  old_value = TCR_1( *p );
116  new_value = old_value + d;
117  while ( ! __kmp_compare_and_store8 ( p, old_value, new_value ) )
118  {
119  KMP_CPU_PAUSE();
120  old_value = TCR_1( *p );
121  new_value = old_value + d;
122  }
123  return old_value;
124 }
125 
126 #if KMP_ARCH_X86
127 kmp_int64
128 __kmp_test_then_add64( volatile kmp_int64 *p, kmp_int64 d )
129 {
130  kmp_int64 old_value, new_value;
131 
132  old_value = TCR_8( *p );
133  new_value = old_value + d;
134  while ( ! __kmp_compare_and_store64 ( p, old_value, new_value ) )
135  {
136  KMP_CPU_PAUSE();
137  old_value = TCR_8( *p );
138  new_value = old_value + d;
139  }
140  return old_value;
141 }
142 #endif /* KMP_ARCH_X86 */
143 
144 kmp_int64
145 __kmp_test_then_or64( volatile kmp_int64 *p, kmp_int64 d )
146 {
147  kmp_int64 old_value, new_value;
148 
149  old_value = TCR_8( *p );
150  new_value = old_value | d;
151  while ( ! __kmp_compare_and_store64 ( p, old_value, new_value ) )
152  {
153  KMP_CPU_PAUSE();
154  old_value = TCR_8( *p );
155  new_value = old_value | d;
156  }
157 
158  return old_value;
159 }
160 
161 kmp_int64
162 __kmp_test_then_and64( volatile kmp_int64 *p, kmp_int64 d )
163 {
164  kmp_int64 old_value, new_value;
165 
166  old_value = TCR_8( *p );
167  new_value = old_value & d;
168  while ( ! __kmp_compare_and_store64 ( p, old_value, new_value ) )
169  {
170  KMP_CPU_PAUSE();
171  old_value = TCR_8( *p );
172  new_value = old_value & d;
173  }
174 
175  return old_value;
176 }
177 
178 #endif /* KMP_ARCH_X86 || KMP_ARCH_X86_64 */
179 
180 /* ------------------------------------------------------------------------ */
181 /* ------------------------------------------------------------------------ */
182