annotate src/os_cpu/linux_zero/vm/atomic_linux_zero.inline.hpp @ 17833:bfdf528be8e8

8038498: Fix includes and C inlining after 8035330 Summary: Change 8035330: Remove G1ParScanPartialArrayClosure and G1ParScanHeapEvacClosure broke the debug build on AIX. The method do_oop_partial_array() is added in a header, but requires the inline function par_write_ref() through several inlined calls. In some cpp files, like arguments.cpp, par_write_ref() is not defined as the corresponding inline header and is not included. The AIX debug VM does not start because of the missing symbol. This change solves this by cleaning up include dependencies. Reviewed-by: tschatzl, stefank
author tschatzl
date Fri, 04 Apr 2014 10:43:56 +0200
parents 63e54c37ac64
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1010
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
1 /*
8675
63e54c37ac64 8008959: Fix non-PCH build on Linux, Windows and MacOS X
simonis
parents: 2256
diff changeset
2 * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
2256
173926398291 7018673: Zero: 6953144, 6990754 and 7009756 made some changes which broke Zero
twisti
parents: 1972
diff changeset
3 * Copyright 2007, 2008, 2011 Red Hat, Inc.
1010
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
4 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
5 *
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
6 * This code is free software; you can redistribute it and/or modify it
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
7 * under the terms of the GNU General Public License version 2 only, as
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
8 * published by the Free Software Foundation.
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
9 *
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
10 * This code is distributed in the hope that it will be useful, but WITHOUT
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
11 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
12 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
13 * version 2 for more details (a copy is included in the LICENSE file that
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
14 * accompanied this code).
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
15 *
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
16 * You should have received a copy of the GNU General Public License version
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
17 * 2 along with this work; if not, write to the Free Software Foundation,
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
18 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
19 *
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1010
diff changeset
20 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1010
diff changeset
21 * or visit www.oracle.com if you need additional information or have any
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1010
diff changeset
22 * questions.
1010
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
23 *
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
24 */
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
25
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
26 #ifndef OS_CPU_LINUX_ZERO_VM_ATOMIC_LINUX_ZERO_INLINE_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
27 #define OS_CPU_LINUX_ZERO_VM_ATOMIC_LINUX_ZERO_INLINE_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
28
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
29 #include "runtime/atomic.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
30 #include "runtime/os.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
31 #include "vm_version_zero.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
32
1010
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
33 // Implementation of class atomic
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
34
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
35 #ifdef M68K
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
36
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
37 /*
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
38 * __m68k_cmpxchg
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
39 *
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
40 * Atomically store newval in *ptr if *ptr is equal to oldval for user space.
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
41 * Returns newval on success and oldval if no exchange happened.
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
42 * This implementation is processor specific and works on
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
43 * 68020 68030 68040 and 68060.
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
44 *
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
45 * It will not work on ColdFire, 68000 and 68010 since they lack the CAS
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
46 * instruction.
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
47 * Using a kernelhelper would be better for arch complete implementation.
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
48 *
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
49 */
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
50
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
51 static inline int __m68k_cmpxchg(int oldval, int newval, volatile int *ptr) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
52 int ret;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
53 __asm __volatile ("cas%.l %0,%2,%1"
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
54 : "=d" (ret), "+m" (*(ptr))
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
55 : "d" (newval), "0" (oldval));
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
56 return ret;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
57 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
58
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
59 /* Perform an atomic compare and swap: if the current value of `*PTR'
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
60 is OLDVAL, then write NEWVAL into `*PTR'. Return the contents of
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
61 `*PTR' before the operation.*/
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
62 static inline int m68k_compare_and_swap(volatile int *ptr,
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
63 int oldval,
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
64 int newval) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
65 for (;;) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
66 int prev = *ptr;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
67 if (prev != oldval)
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
68 return prev;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
69
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
70 if (__m68k_cmpxchg (prev, newval, ptr) == newval)
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
71 // Success.
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
72 return prev;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
73
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
74 // We failed even though prev == oldval. Try again.
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
75 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
76 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
77
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
78 /* Atomically add an int to memory. */
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
79 static inline int m68k_add_and_fetch(volatile int *ptr, int add_value) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
80 for (;;) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
81 // Loop until success.
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
82
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
83 int prev = *ptr;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
84
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
85 if (__m68k_cmpxchg (prev, prev + add_value, ptr) == prev + add_value)
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
86 return prev + add_value;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
87 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
88 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
89
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
90 /* Atomically write VALUE into `*PTR' and returns the previous
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
91 contents of `*PTR'. */
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
92 static inline int m68k_lock_test_and_set(volatile int *ptr, int newval) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
93 for (;;) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
94 // Loop until success.
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
95 int prev = *ptr;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
96
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
97 if (__m68k_cmpxchg (prev, newval, ptr) == prev)
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
98 return prev;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
99 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
100 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
101 #endif // M68K
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
102
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
103 #ifdef ARM
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
104
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
105 /*
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
106 * __kernel_cmpxchg
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
107 *
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
108 * Atomically store newval in *ptr if *ptr is equal to oldval for user space.
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
109 * Return zero if *ptr was changed or non-zero if no exchange happened.
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
110 * The C flag is also set if *ptr was changed to allow for assembly
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
111 * optimization in the calling code.
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
112 *
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
113 */
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
114
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
115 typedef int (__kernel_cmpxchg_t)(int oldval, int newval, volatile int *ptr);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
116 #define __kernel_cmpxchg (*(__kernel_cmpxchg_t *) 0xffff0fc0)
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
117
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
118
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
119
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
120 /* Perform an atomic compare and swap: if the current value of `*PTR'
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
121 is OLDVAL, then write NEWVAL into `*PTR'. Return the contents of
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
122 `*PTR' before the operation.*/
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
123 static inline int arm_compare_and_swap(volatile int *ptr,
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
124 int oldval,
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
125 int newval) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
126 for (;;) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
127 int prev = *ptr;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
128 if (prev != oldval)
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
129 return prev;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
130
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
131 if (__kernel_cmpxchg (prev, newval, ptr) == 0)
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
132 // Success.
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
133 return prev;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
134
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
135 // We failed even though prev == oldval. Try again.
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
136 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
137 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
138
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
139 /* Atomically add an int to memory. */
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
140 static inline int arm_add_and_fetch(volatile int *ptr, int add_value) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
141 for (;;) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
142 // Loop until a __kernel_cmpxchg succeeds.
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
143
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
144 int prev = *ptr;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
145
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
146 if (__kernel_cmpxchg (prev, prev + add_value, ptr) == 0)
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
147 return prev + add_value;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
148 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
149 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
150
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
151 /* Atomically write VALUE into `*PTR' and returns the previous
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
152 contents of `*PTR'. */
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
153 static inline int arm_lock_test_and_set(volatile int *ptr, int newval) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
154 for (;;) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
155 // Loop until a __kernel_cmpxchg succeeds.
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
156 int prev = *ptr;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
157
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
158 if (__kernel_cmpxchg (prev, newval, ptr) == 0)
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
159 return prev;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
160 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
161 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
162 #endif // ARM
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
163
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
164 inline void Atomic::store(jint store_value, volatile jint* dest) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
165 *dest = store_value;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
166 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
167
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
168 inline void Atomic::store_ptr(intptr_t store_value, intptr_t* dest) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
169 *dest = store_value;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
170 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
171
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
172 inline jint Atomic::add(jint add_value, volatile jint* dest) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
173 #ifdef ARM
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
174 return arm_add_and_fetch(dest, add_value);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
175 #else
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
176 #ifdef M68K
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
177 return m68k_add_and_fetch(dest, add_value);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
178 #else
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
179 return __sync_add_and_fetch(dest, add_value);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
180 #endif // M68K
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
181 #endif // ARM
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
182 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
183
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
184 inline intptr_t Atomic::add_ptr(intptr_t add_value, volatile intptr_t* dest) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
185 #ifdef ARM
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
186 return arm_add_and_fetch(dest, add_value);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
187 #else
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
188 #ifdef M68K
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
189 return m68k_add_and_fetch(dest, add_value);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
190 #else
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
191 return __sync_add_and_fetch(dest, add_value);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
192 #endif // M68K
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
193 #endif // ARM
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
194 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
195
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
196 inline void* Atomic::add_ptr(intptr_t add_value, volatile void* dest) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
197 return (void *) add_ptr(add_value, (volatile intptr_t *) dest);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
198 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
199
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
200 inline void Atomic::inc(volatile jint* dest) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
201 add(1, dest);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
202 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
203
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
204 inline void Atomic::inc_ptr(volatile intptr_t* dest) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
205 add_ptr(1, dest);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
206 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
207
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
208 inline void Atomic::inc_ptr(volatile void* dest) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
209 add_ptr(1, dest);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
210 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
211
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
212 inline void Atomic::dec(volatile jint* dest) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
213 add(-1, dest);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
214 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
215
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
216 inline void Atomic::dec_ptr(volatile intptr_t* dest) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
217 add_ptr(-1, dest);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
218 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
219
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
220 inline void Atomic::dec_ptr(volatile void* dest) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
221 add_ptr(-1, dest);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
222 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
223
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
224 inline jint Atomic::xchg(jint exchange_value, volatile jint* dest) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
225 #ifdef ARM
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
226 return arm_lock_test_and_set(dest, exchange_value);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
227 #else
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
228 #ifdef M68K
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
229 return m68k_lock_test_and_set(dest, exchange_value);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
230 #else
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
231 // __sync_lock_test_and_set is a bizarrely named atomic exchange
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
232 // operation. Note that some platforms only support this with the
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
233 // limitation that the only valid value to store is the immediate
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
234 // constant 1. There is a test for this in JNI_CreateJavaVM().
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
235 return __sync_lock_test_and_set (dest, exchange_value);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
236 #endif // M68K
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
237 #endif // ARM
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
238 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
239
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
240 inline intptr_t Atomic::xchg_ptr(intptr_t exchange_value,
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
241 volatile intptr_t* dest) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
242 #ifdef ARM
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
243 return arm_lock_test_and_set(dest, exchange_value);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
244 #else
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
245 #ifdef M68K
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
246 return m68k_lock_test_and_set(dest, exchange_value);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
247 #else
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
248 return __sync_lock_test_and_set (dest, exchange_value);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
249 #endif // M68K
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
250 #endif // ARM
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
251 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
252
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
253 inline void* Atomic::xchg_ptr(void* exchange_value, volatile void* dest) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
254 return (void *) xchg_ptr((intptr_t) exchange_value,
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
255 (volatile intptr_t*) dest);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
256 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
257
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
258 inline jint Atomic::cmpxchg(jint exchange_value,
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
259 volatile jint* dest,
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
260 jint compare_value) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
261 #ifdef ARM
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
262 return arm_compare_and_swap(dest, compare_value, exchange_value);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
263 #else
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
264 #ifdef M68K
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
265 return m68k_compare_and_swap(dest, compare_value, exchange_value);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
266 #else
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
267 return __sync_val_compare_and_swap(dest, compare_value, exchange_value);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
268 #endif // M68K
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
269 #endif // ARM
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
270 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
271
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
272 inline jlong Atomic::cmpxchg(jlong exchange_value,
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
273 volatile jlong* dest,
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
274 jlong compare_value) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
275
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
276 return __sync_val_compare_and_swap(dest, compare_value, exchange_value);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
277 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
278
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
279 inline intptr_t Atomic::cmpxchg_ptr(intptr_t exchange_value,
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
280 volatile intptr_t* dest,
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
281 intptr_t compare_value) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
282 #ifdef ARM
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
283 return arm_compare_and_swap(dest, compare_value, exchange_value);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
284 #else
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
285 #ifdef M68K
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
286 return m68k_compare_and_swap(dest, compare_value, exchange_value);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
287 #else
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
288 return __sync_val_compare_and_swap(dest, compare_value, exchange_value);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
289 #endif // M68K
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
290 #endif // ARM
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
291 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
292
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
293 inline void* Atomic::cmpxchg_ptr(void* exchange_value,
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
294 volatile void* dest,
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
295 void* compare_value) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
296
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
297 return (void *) cmpxchg_ptr((intptr_t) exchange_value,
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
298 (volatile intptr_t*) dest,
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
299 (intptr_t) compare_value);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
300 }
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
301
2256
173926398291 7018673: Zero: 6953144, 6990754 and 7009756 made some changes which broke Zero
twisti
parents: 1972
diff changeset
302 inline jlong Atomic::load(volatile jlong* src) {
173926398291 7018673: Zero: 6953144, 6990754 and 7009756 made some changes which broke Zero
twisti
parents: 1972
diff changeset
303 volatile jlong dest;
173926398291 7018673: Zero: 6953144, 6990754 and 7009756 made some changes which broke Zero
twisti
parents: 1972
diff changeset
304 os::atomic_copy64(src, &dest);
173926398291 7018673: Zero: 6953144, 6990754 and 7009756 made some changes which broke Zero
twisti
parents: 1972
diff changeset
305 return dest;
173926398291 7018673: Zero: 6953144, 6990754 and 7009756 made some changes which broke Zero
twisti
parents: 1972
diff changeset
306 }
173926398291 7018673: Zero: 6953144, 6990754 and 7009756 made some changes which broke Zero
twisti
parents: 1972
diff changeset
307
173926398291 7018673: Zero: 6953144, 6990754 and 7009756 made some changes which broke Zero
twisti
parents: 1972
diff changeset
308 inline void Atomic::store(jlong store_value, jlong* dest) {
173926398291 7018673: Zero: 6953144, 6990754 and 7009756 made some changes which broke Zero
twisti
parents: 1972
diff changeset
309 os::atomic_copy64((volatile jlong*)&store_value, (volatile jlong*)dest);
173926398291 7018673: Zero: 6953144, 6990754 and 7009756 made some changes which broke Zero
twisti
parents: 1972
diff changeset
310 }
173926398291 7018673: Zero: 6953144, 6990754 and 7009756 made some changes which broke Zero
twisti
parents: 1972
diff changeset
311
173926398291 7018673: Zero: 6953144, 6990754 and 7009756 made some changes which broke Zero
twisti
parents: 1972
diff changeset
312 inline void Atomic::store(jlong store_value, volatile jlong* dest) {
173926398291 7018673: Zero: 6953144, 6990754 and 7009756 made some changes which broke Zero
twisti
parents: 1972
diff changeset
313 os::atomic_copy64((volatile jlong*)&store_value, dest);
173926398291 7018673: Zero: 6953144, 6990754 and 7009756 made some changes which broke Zero
twisti
parents: 1972
diff changeset
314 }
173926398291 7018673: Zero: 6953144, 6990754 and 7009756 made some changes which broke Zero
twisti
parents: 1972
diff changeset
315
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
316 #endif // OS_CPU_LINUX_ZERO_VM_ATOMIC_LINUX_ZERO_INLINE_HPP