blob: 19bd96b44018e40a81e59d13d94a07e00c6245b7 [file] [log] [blame]
Jim Cownie5e8470a2013-09-27 10:38:44 +00001/*
2 * z_Windows_NT-586_util.c -- platform specific routines.
3 * $Revision: 42181 $
4 * $Date: 2013-03-26 15:04:45 -0500 (Tue, 26 Mar 2013) $
5 */
6
7
8//===----------------------------------------------------------------------===//
9//
10// The LLVM Compiler Infrastructure
11//
12// This file is dual licensed under the MIT and the University of Illinois Open
13// Source Licenses. See LICENSE.txt for details.
14//
15//===----------------------------------------------------------------------===//
16
17
18#include "kmp.h"
19
20#if (KMP_ARCH_X86 || KMP_ARCH_X86_64)
21/* Only 32-bit "add-exchange" instruction on IA-32 architecture causes us to
22 * use compare_and_store for these routines
23 */
24
25kmp_int32
26__kmp_test_then_or32( volatile kmp_int32 *p, kmp_int32 d )
27{
28 kmp_int32 old_value, new_value;
29
30 old_value = TCR_4( *p );
31 new_value = old_value | d;
32
33 while ( ! __kmp_compare_and_store32 ( p, old_value, new_value ) )
34 {
35 KMP_CPU_PAUSE();
36 old_value = TCR_4( *p );
37 new_value = old_value | d;
38 }
39
40 return old_value;
41}
42
43kmp_int32
44__kmp_test_then_and32( volatile kmp_int32 *p, kmp_int32 d )
45{
46 kmp_int32 old_value, new_value;
47
48 old_value = TCR_4( *p );
49 new_value = old_value & d;
50
51 while ( ! __kmp_compare_and_store32 ( p, old_value, new_value ) )
52 {
53 KMP_CPU_PAUSE();
54 old_value = TCR_4( *p );
55 new_value = old_value & d;
56 }
57 return old_value;
58}
59
60#if KMP_ARCH_X86
61kmp_int64
62__kmp_test_then_add64( volatile kmp_int64 *p, kmp_int64 d )
63{
64 kmp_int64 old_value, new_value;
65
66 old_value = TCR_8( *p );
67 new_value = old_value + d;
68 while ( ! __kmp_compare_and_store64 ( p, old_value, new_value ) )
69 {
70 KMP_CPU_PAUSE();
71 old_value = TCR_8( *p );
72 new_value = old_value + d;
73 }
74
75 return old_value;
76}
77#endif /* KMP_ARCH_X86 */
78
79kmp_int64
80__kmp_test_then_or64( volatile kmp_int64 *p, kmp_int64 d )
81{
82 kmp_int64 old_value, new_value;
83
84 old_value = TCR_8( *p );
85 new_value = old_value | d;
86 while ( ! __kmp_compare_and_store64 ( p, old_value, new_value ) )
87 {
88 KMP_CPU_PAUSE();
89 old_value = TCR_8( *p );
90 new_value = old_value | d;
91 }
92
93 return old_value;
94}
95
96kmp_int64
97__kmp_test_then_and64( volatile kmp_int64 *p, kmp_int64 d )
98{
99 kmp_int64 old_value, new_value;
100
101 old_value = TCR_8( *p );
102 new_value = old_value & d;
103 while ( ! __kmp_compare_and_store64 ( p, old_value, new_value ) )
104 {
105 KMP_CPU_PAUSE();
106 old_value = TCR_8( *p );
107 new_value = old_value & d;
108 }
109
110 return old_value;
111}
112
113#endif /* KMP_ARCH_X86 || KMP_ARCH_X86_64 */
114
115/* ------------------------------------------------------------------------ */
116/* ------------------------------------------------------------------------ */
117