annotate src/os_cpu/aix_ppc/vm/atomic_aix_ppc.inline.hpp @ 17793:c668f307a4c0

8031319: PPC64: Some fixes in ppc and aix coding. Reviewed-by: kvn
author goetz
date Tue, 07 Jan 2014 17:24:59 +0100
parents 666e6ce3976c
children ce8f6bb717c9
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
14415
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
1 /*
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
2 * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
3 * Copyright 2012, 2013 SAP AG. All rights reserved.
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
4 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
5 *
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
6 * This code is free software; you can redistribute it and/or modify it
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
7 * under the terms of the GNU General Public License version 2 only, as
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
8 * published by the Free Software Foundation.
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
9 *
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
10 * This code is distributed in the hope that it will be useful, but WITHOUT
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
11 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
12 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
13 * version 2 for more details (a copy is included in the LICENSE file that
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
14 * accompanied this code).
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
15 *
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
16 * You should have received a copy of the GNU General Public License version
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
17 * 2 along with this work; if not, write to the Free Software Foundation,
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
18 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
19 *
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
20 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
21 * or visit www.oracle.com if you need additional information or have any
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
22 * questions.
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
23 *
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
24 */
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
25
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
26 #ifndef OS_CPU_AIX_OJDKPPC_VM_ATOMIC_AIX_PPC_INLINE_HPP
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
27 #define OS_CPU_AIX_OJDKPPC_VM_ATOMIC_AIX_PPC_INLINE_HPP
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
28
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
29 #include "orderAccess_aix_ppc.inline.hpp"
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
30 #include "runtime/atomic.hpp"
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
31 #include "runtime/os.hpp"
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
32 #include "vm_version_ppc.hpp"
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
33
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
34 #ifndef _LP64
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
35 #error "Atomic currently only impleneted for PPC64"
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
36 #endif
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
37
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
38 // Implementation of class atomic
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
39
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
40 inline void Atomic::store (jbyte store_value, jbyte* dest) { *dest = store_value; }
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
41 inline void Atomic::store (jshort store_value, jshort* dest) { *dest = store_value; }
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
42 inline void Atomic::store (jint store_value, jint* dest) { *dest = store_value; }
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
43 inline void Atomic::store (jlong store_value, jlong* dest) { *dest = store_value; }
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
44 inline void Atomic::store_ptr(intptr_t store_value, intptr_t* dest) { *dest = store_value; }
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
45 inline void Atomic::store_ptr(void* store_value, void* dest) { *(void**)dest = store_value; }
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
46
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
47 inline void Atomic::store (jbyte store_value, volatile jbyte* dest) { *dest = store_value; }
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
48 inline void Atomic::store (jshort store_value, volatile jshort* dest) { *dest = store_value; }
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
49 inline void Atomic::store (jint store_value, volatile jint* dest) { *dest = store_value; }
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
50 inline void Atomic::store (jlong store_value, volatile jlong* dest) { *dest = store_value; }
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
51 inline void Atomic::store_ptr(intptr_t store_value, volatile intptr_t* dest) { *dest = store_value; }
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
52 inline void Atomic::store_ptr(void* store_value, volatile void* dest) { *(void* volatile *)dest = store_value; }
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
53
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
54 inline jlong Atomic::load(volatile jlong* src) { return *src; }
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
55
17793
c668f307a4c0 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 14415
diff changeset
56 //
c668f307a4c0 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 14415
diff changeset
57 // machine barrier instructions:
c668f307a4c0 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 14415
diff changeset
58 //
c668f307a4c0 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 14415
diff changeset
59 // - ppc_sync two-way memory barrier, aka fence
c668f307a4c0 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 14415
diff changeset
60 // - ppc_lwsync orders Store|Store,
c668f307a4c0 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 14415
diff changeset
61 // Load|Store,
c668f307a4c0 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 14415
diff changeset
62 // Load|Load,
c668f307a4c0 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 14415
diff changeset
63 // but not Store|Load
c668f307a4c0 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 14415
diff changeset
64 // - ppc_eieio orders memory accesses for device memory (only)
c668f307a4c0 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 14415
diff changeset
65 // - ppc_isync invalidates speculatively executed instructions
c668f307a4c0 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 14415
diff changeset
66 // From the POWER ISA 2.06 documentation:
c668f307a4c0 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 14415
diff changeset
67 // "[...] an isync instruction prevents the execution of
c668f307a4c0 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 14415
diff changeset
68 // instructions following the isync until instructions
c668f307a4c0 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 14415
diff changeset
69 // preceding the isync have completed, [...]"
c668f307a4c0 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 14415
diff changeset
70 // From IBM's AIX assembler reference:
c668f307a4c0 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 14415
diff changeset
71 // "The isync [...] instructions causes the processor to
c668f307a4c0 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 14415
diff changeset
72 // refetch any instructions that might have been fetched
c668f307a4c0 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 14415
diff changeset
73 // prior to the isync instruction. The instruction isync
c668f307a4c0 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 14415
diff changeset
74 // causes the processor to wait for all previous instructions
c668f307a4c0 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 14415
diff changeset
75 // to complete. Then any instructions already fetched are
c668f307a4c0 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 14415
diff changeset
76 // discarded and instruction processing continues in the
c668f307a4c0 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 14415
diff changeset
77 // environment established by the previous instructions."
c668f307a4c0 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 14415
diff changeset
78 //
c668f307a4c0 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 14415
diff changeset
79 // semantic barrier instructions:
c668f307a4c0 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 14415
diff changeset
80 // (as defined in orderAccess.hpp)
c668f307a4c0 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 14415
diff changeset
81 //
c668f307a4c0 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 14415
diff changeset
82 // - ppc_release orders Store|Store, (maps to ppc_lwsync)
c668f307a4c0 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 14415
diff changeset
83 // Load|Store
c668f307a4c0 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 14415
diff changeset
84 // - ppc_acquire orders Load|Store, (maps to ppc_lwsync)
c668f307a4c0 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 14415
diff changeset
85 // Load|Load
c668f307a4c0 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 14415
diff changeset
86 // - ppc_fence orders Store|Store, (maps to ppc_sync)
c668f307a4c0 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 14415
diff changeset
87 // Load|Store,
c668f307a4c0 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 14415
diff changeset
88 // Load|Load,
c668f307a4c0 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 14415
diff changeset
89 // Store|Load
c668f307a4c0 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 14415
diff changeset
90 //
14415
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
91
17793
c668f307a4c0 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 14415
diff changeset
92 #define strasm_sync "\n sync \n"
c668f307a4c0 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 14415
diff changeset
93 #define strasm_lwsync "\n lwsync \n"
c668f307a4c0 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 14415
diff changeset
94 #define strasm_isync "\n isync \n"
c668f307a4c0 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 14415
diff changeset
95 #define strasm_release strasm_lwsync
c668f307a4c0 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 14415
diff changeset
96 #define strasm_acquire strasm_lwsync
c668f307a4c0 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 14415
diff changeset
97 #define strasm_fence strasm_sync
c668f307a4c0 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 14415
diff changeset
98 #define strasm_nobarrier ""
c668f307a4c0 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 14415
diff changeset
99 #define strasm_nobarrier_clobber_memory ""
14415
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
100
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
101 inline jint Atomic::add (jint add_value, volatile jint* dest) {
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
102
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
103 unsigned int result;
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
104
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
105 __asm__ __volatile__ (
17793
c668f307a4c0 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 14415
diff changeset
106 strasm_lwsync
14415
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
107 "1: lwarx %0, 0, %2 \n"
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
108 " add %0, %0, %1 \n"
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
109 " stwcx. %0, 0, %2 \n"
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
110 " bne- 1b \n"
17793
c668f307a4c0 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 14415
diff changeset
111 strasm_isync
14415
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
112 : /*%0*/"=&r" (result)
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
113 : /*%1*/"r" (add_value), /*%2*/"r" (dest)
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
114 : "cc", "memory" );
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
115
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
116 return (jint) result;
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
117 }
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
118
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
119
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
120 inline intptr_t Atomic::add_ptr(intptr_t add_value, volatile intptr_t* dest) {
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
121
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
122 long result;
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
123
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
124 __asm__ __volatile__ (
17793
c668f307a4c0 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 14415
diff changeset
125 strasm_lwsync
14415
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
126 "1: ldarx %0, 0, %2 \n"
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
127 " add %0, %0, %1 \n"
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
128 " stdcx. %0, 0, %2 \n"
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
129 " bne- 1b \n"
17793
c668f307a4c0 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 14415
diff changeset
130 strasm_isync
14415
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
131 : /*%0*/"=&r" (result)
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
132 : /*%1*/"r" (add_value), /*%2*/"r" (dest)
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
133 : "cc", "memory" );
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
134
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
135 return (intptr_t) result;
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
136 }
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
137
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
138 inline void* Atomic::add_ptr(intptr_t add_value, volatile void* dest) {
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
139 return (void*)add_ptr(add_value, (volatile intptr_t*)dest);
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
140 }
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
141
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
142
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
143 inline void Atomic::inc (volatile jint* dest) {
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
144
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
145 unsigned int temp;
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
146
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
147 __asm__ __volatile__ (
17793
c668f307a4c0 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 14415
diff changeset
148 strasm_nobarrier
14415
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
149 "1: lwarx %0, 0, %2 \n"
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
150 " addic %0, %0, 1 \n"
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
151 " stwcx. %0, 0, %2 \n"
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
152 " bne- 1b \n"
17793
c668f307a4c0 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 14415
diff changeset
153 strasm_nobarrier
14415
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
154 : /*%0*/"=&r" (temp), "=m" (*dest)
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
155 : /*%2*/"r" (dest), "m" (*dest)
17793
c668f307a4c0 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 14415
diff changeset
156 : "cc" strasm_nobarrier_clobber_memory);
14415
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
157
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
158 }
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
159
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
160 inline void Atomic::inc_ptr(volatile intptr_t* dest) {
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
161
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
162 long temp;
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
163
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
164 __asm__ __volatile__ (
17793
c668f307a4c0 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 14415
diff changeset
165 strasm_nobarrier
14415
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
166 "1: ldarx %0, 0, %2 \n"
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
167 " addic %0, %0, 1 \n"
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
168 " stdcx. %0, 0, %2 \n"
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
169 " bne- 1b \n"
17793
c668f307a4c0 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 14415
diff changeset
170 strasm_nobarrier
14415
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
171 : /*%0*/"=&r" (temp), "=m" (*dest)
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
172 : /*%2*/"r" (dest), "m" (*dest)
17793
c668f307a4c0 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 14415
diff changeset
173 : "cc" strasm_nobarrier_clobber_memory);
14415
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
174
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
175 }
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
176
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
177 inline void Atomic::inc_ptr(volatile void* dest) {
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
178 inc_ptr((volatile intptr_t*)dest);
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
179 }
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
180
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
181
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
182 inline void Atomic::dec (volatile jint* dest) {
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
183
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
184 unsigned int temp;
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
185
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
186 __asm__ __volatile__ (
17793
c668f307a4c0 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 14415
diff changeset
187 strasm_nobarrier
14415
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
188 "1: lwarx %0, 0, %2 \n"
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
189 " addic %0, %0, -1 \n"
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
190 " stwcx. %0, 0, %2 \n"
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
191 " bne- 1b \n"
17793
c668f307a4c0 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 14415
diff changeset
192 strasm_nobarrier
14415
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
193 : /*%0*/"=&r" (temp), "=m" (*dest)
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
194 : /*%2*/"r" (dest), "m" (*dest)
17793
c668f307a4c0 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 14415
diff changeset
195 : "cc" strasm_nobarrier_clobber_memory);
14415
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
196
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
197 }
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
198
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
199 inline void Atomic::dec_ptr(volatile intptr_t* dest) {
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
200
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
201 long temp;
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
202
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
203 __asm__ __volatile__ (
17793
c668f307a4c0 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 14415
diff changeset
204 strasm_nobarrier
14415
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
205 "1: ldarx %0, 0, %2 \n"
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
206 " addic %0, %0, -1 \n"
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
207 " stdcx. %0, 0, %2 \n"
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
208 " bne- 1b \n"
17793
c668f307a4c0 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 14415
diff changeset
209 strasm_nobarrier
14415
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
210 : /*%0*/"=&r" (temp), "=m" (*dest)
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
211 : /*%2*/"r" (dest), "m" (*dest)
17793
c668f307a4c0 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 14415
diff changeset
212 : "cc" strasm_nobarrier_clobber_memory);
14415
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
213
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
214 }
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
215
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
216 inline void Atomic::dec_ptr(volatile void* dest) {
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
217 dec_ptr((volatile intptr_t*)dest);
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
218 }
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
219
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
220 inline jint Atomic::xchg(jint exchange_value, volatile jint* dest) {
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
221
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
222 // Note that xchg_ptr doesn't necessarily do an acquire
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
223 // (see synchronizer.cpp).
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
224
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
225 unsigned int old_value;
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
226 const uint64_t zero = 0;
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
227
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
228 __asm__ __volatile__ (
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
229 /* lwsync */
17793
c668f307a4c0 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 14415
diff changeset
230 strasm_lwsync
14415
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
231 /* atomic loop */
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
232 "1: \n"
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
233 " lwarx %[old_value], %[dest], %[zero] \n"
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
234 " stwcx. %[exchange_value], %[dest], %[zero] \n"
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
235 " bne- 1b \n"
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
236 /* isync */
17793
c668f307a4c0 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 14415
diff changeset
237 strasm_sync
14415
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
238 /* exit */
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
239 "2: \n"
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
240 /* out */
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
241 : [old_value] "=&r" (old_value),
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
242 "=m" (*dest)
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
243 /* in */
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
244 : [dest] "b" (dest),
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
245 [zero] "r" (zero),
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
246 [exchange_value] "r" (exchange_value),
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
247 "m" (*dest)
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
248 /* clobber */
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
249 : "cc",
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
250 "memory"
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
251 );
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
252
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
253 return (jint) old_value;
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
254 }
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
255
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
256 inline intptr_t Atomic::xchg_ptr(intptr_t exchange_value, volatile intptr_t* dest) {
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
257
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
258 // Note that xchg_ptr doesn't necessarily do an acquire
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
259 // (see synchronizer.cpp).
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
260
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
261 long old_value;
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
262 const uint64_t zero = 0;
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
263
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
264 __asm__ __volatile__ (
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
265 /* lwsync */
17793
c668f307a4c0 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 14415
diff changeset
266 strasm_lwsync
14415
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
267 /* atomic loop */
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
268 "1: \n"
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
269 " ldarx %[old_value], %[dest], %[zero] \n"
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
270 " stdcx. %[exchange_value], %[dest], %[zero] \n"
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
271 " bne- 1b \n"
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
272 /* isync */
17793
c668f307a4c0 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 14415
diff changeset
273 strasm_sync
14415
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
274 /* exit */
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
275 "2: \n"
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
276 /* out */
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
277 : [old_value] "=&r" (old_value),
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
278 "=m" (*dest)
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
279 /* in */
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
280 : [dest] "b" (dest),
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
281 [zero] "r" (zero),
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
282 [exchange_value] "r" (exchange_value),
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
283 "m" (*dest)
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
284 /* clobber */
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
285 : "cc",
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
286 "memory"
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
287 );
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
288
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
289 return (intptr_t) old_value;
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
290 }
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
291
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
292 inline void* Atomic::xchg_ptr(void* exchange_value, volatile void* dest) {
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
293 return (void*)xchg_ptr((intptr_t)exchange_value, (volatile intptr_t*)dest);
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
294 }
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
295
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
296 inline jint Atomic::cmpxchg(jint exchange_value, volatile jint* dest, jint compare_value) {
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
297
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
298 // Note that cmpxchg guarantees a two-way memory barrier across
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
299 // the cmpxchg, so it's really a a 'fence_cmpxchg_acquire'
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
300 // (see atomic.hpp).
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
301
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
302 unsigned int old_value;
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
303 const uint64_t zero = 0;
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
304
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
305 __asm__ __volatile__ (
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
306 /* fence */
17793
c668f307a4c0 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 14415
diff changeset
307 strasm_sync
14415
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
308 /* simple guard */
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
309 " lwz %[old_value], 0(%[dest]) \n"
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
310 " cmpw %[compare_value], %[old_value] \n"
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
311 " bne- 2f \n"
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
312 /* atomic loop */
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
313 "1: \n"
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
314 " lwarx %[old_value], %[dest], %[zero] \n"
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
315 " cmpw %[compare_value], %[old_value] \n"
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
316 " bne- 2f \n"
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
317 " stwcx. %[exchange_value], %[dest], %[zero] \n"
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
318 " bne- 1b \n"
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
319 /* acquire */
17793
c668f307a4c0 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 14415
diff changeset
320 strasm_sync
14415
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
321 /* exit */
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
322 "2: \n"
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
323 /* out */
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
324 : [old_value] "=&r" (old_value),
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
325 "=m" (*dest)
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
326 /* in */
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
327 : [dest] "b" (dest),
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
328 [zero] "r" (zero),
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
329 [compare_value] "r" (compare_value),
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
330 [exchange_value] "r" (exchange_value),
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
331 "m" (*dest)
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
332 /* clobber */
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
333 : "cc",
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
334 "memory"
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
335 );
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
336
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
337 return (jint) old_value;
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
338 }
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
339
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
340 inline jlong Atomic::cmpxchg(jlong exchange_value, volatile jlong* dest, jlong compare_value) {
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
341
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
342 // Note that cmpxchg guarantees a two-way memory barrier across
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
343 // the cmpxchg, so it's really a a 'fence_cmpxchg_acquire'
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
344 // (see atomic.hpp).
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
345
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
346 long old_value;
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
347 const uint64_t zero = 0;
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
348
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
349 __asm__ __volatile__ (
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
350 /* fence */
17793
c668f307a4c0 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 14415
diff changeset
351 strasm_sync
14415
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
352 /* simple guard */
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
353 " ld %[old_value], 0(%[dest]) \n"
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
354 " cmpd %[compare_value], %[old_value] \n"
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
355 " bne- 2f \n"
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
356 /* atomic loop */
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
357 "1: \n"
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
358 " ldarx %[old_value], %[dest], %[zero] \n"
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
359 " cmpd %[compare_value], %[old_value] \n"
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
360 " bne- 2f \n"
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
361 " stdcx. %[exchange_value], %[dest], %[zero] \n"
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
362 " bne- 1b \n"
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
363 /* acquire */
17793
c668f307a4c0 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 14415
diff changeset
364 strasm_sync
14415
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
365 /* exit */
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
366 "2: \n"
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
367 /* out */
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
368 : [old_value] "=&r" (old_value),
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
369 "=m" (*dest)
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
370 /* in */
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
371 : [dest] "b" (dest),
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
372 [zero] "r" (zero),
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
373 [compare_value] "r" (compare_value),
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
374 [exchange_value] "r" (exchange_value),
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
375 "m" (*dest)
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
376 /* clobber */
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
377 : "cc",
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
378 "memory"
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
379 );
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
380
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
381 return (jlong) old_value;
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
382 }
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
383
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
384 inline intptr_t Atomic::cmpxchg_ptr(intptr_t exchange_value, volatile intptr_t* dest, intptr_t compare_value) {
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
385 return (intptr_t)cmpxchg((jlong)exchange_value, (volatile jlong*)dest, (jlong)compare_value);
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
386 }
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
387
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
388 inline void* Atomic::cmpxchg_ptr(void* exchange_value, volatile void* dest, void* compare_value) {
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
389 return (void*)cmpxchg((jlong)exchange_value, (volatile jlong*)dest, (jlong)compare_value);
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
390 }
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
391
17793
c668f307a4c0 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 14415
diff changeset
392 #undef strasm_sync
c668f307a4c0 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 14415
diff changeset
393 #undef strasm_lwsync
c668f307a4c0 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 14415
diff changeset
394 #undef strasm_isync
c668f307a4c0 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 14415
diff changeset
395 #undef strasm_release
c668f307a4c0 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 14415
diff changeset
396 #undef strasm_acquire
c668f307a4c0 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 14415
diff changeset
397 #undef strasm_fence
c668f307a4c0 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 14415
diff changeset
398 #undef strasm_nobarrier
c668f307a4c0 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 14415
diff changeset
399 #undef strasm_nobarrier_clobber_memory
14415
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
400
666e6ce3976c 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
401 #endif // OS_CPU_AIX_OJDKPPC_VM_ATOMIC_AIX_PPC_INLINE_HPP