orderAccess_windows_x86.inline.hpp revision 0:a61af66fc99e
1196212Sscottl/*
2196212Sscottl * Copyright 2003 Sun Microsystems, Inc.  All Rights Reserved.
3196212Sscottl * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4196212Sscottl *
5196212Sscottl * This code is free software; you can redistribute it and/or modify it
6196212Sscottl * under the terms of the GNU General Public License version 2 only, as
7196212Sscottl * published by the Free Software Foundation.
8196212Sscottl *
9196212Sscottl * This code is distributed in the hope that it will be useful, but WITHOUT
10196212Sscottl * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11196212Sscottl * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12196212Sscottl * version 2 for more details (a copy is included in the LICENSE file that
13196212Sscottl * accompanied this code).
14196212Sscottl *
15196212Sscottl * You should have received a copy of the GNU General Public License version
16196212Sscottl * 2 along with this work; if not, write to the Free Software Foundation,
17196212Sscottl * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18196212Sscottl *
19196212Sscottl * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
20196212Sscottl * CA 95054 USA or visit www.sun.com if you need additional information or
21196212Sscottl * have any questions.
22196212Sscottl *
23196212Sscottl */
24196212Sscottl
25196212Sscottl#pragma warning(disable: 4035) // Disables warnings reporting missing return statement
26196212Sscottl
27196212Sscottl// Implementation of class OrderAccess.
28196212Sscottl
29196212Sscottlinline void OrderAccess::loadload()   { acquire(); }
30196212Sscottlinline void OrderAccess::storestore() { release(); }
31196212Sscottlinline void OrderAccess::loadstore()  { acquire(); }
32196212Sscottlinline void OrderAccess::storeload()  { fence(); }
33196212Sscottl
34196212Sscottlinline void OrderAccess::acquire() {
35196212Sscottl#ifndef AMD64
36196212Sscottl  __asm {
37196212Sscottl    mov eax, dword ptr [esp];
38196212Sscottl  }
39196212Sscottl#endif // !AMD64
40196212Sscottl}
41196212Sscottl
42196212Sscottlinline void OrderAccess::release() {
43196212Sscottl  // A volatile store has release semantics.
44196212Sscottl  dummy = 0;
45196212Sscottl}
46196212Sscottl
47196212Sscottlinline void OrderAccess::fence() {
48196212Sscottl#ifdef AMD64
49196212Sscottl  (*os::fence_func)();
50196212Sscottl#else
51196212Sscottl  if (os::is_MP()) {
52196212Sscottl    __asm {
53196212Sscottl      lock add dword ptr [esp], 0;
54196212Sscottl    }
55196212Sscottl  }
56196212Sscottl#endif // AMD64
57196212Sscottl}
58196212Sscottl
59196212Sscottlinline jbyte    OrderAccess::load_acquire(volatile jbyte*   p) { return *p; }
60196212Sscottlinline jshort   OrderAccess::load_acquire(volatile jshort*  p) { return *p; }
61196212Sscottlinline jint     OrderAccess::load_acquire(volatile jint*    p) { return *p; }
62196212Sscottlinline jlong    OrderAccess::load_acquire(volatile jlong*   p) { return *p; }
63196212Sscottlinline jubyte   OrderAccess::load_acquire(volatile jubyte*  p) { return *p; }
64196212Sscottlinline jushort  OrderAccess::load_acquire(volatile jushort* p) { return *p; }
65196212Sscottlinline juint    OrderAccess::load_acquire(volatile juint*   p) { return *p; }
66196212Sscottlinline julong   OrderAccess::load_acquire(volatile julong*  p) { return *p; }
67196212Sscottlinline jfloat   OrderAccess::load_acquire(volatile jfloat*  p) { return *p; }
68196212Sscottlinline jdouble  OrderAccess::load_acquire(volatile jdouble* p) { return *p; }
69196212Sscottl
70196212Sscottlinline intptr_t OrderAccess::load_ptr_acquire(volatile intptr_t*   p) { return *p; }
71196212Sscottlinline void*    OrderAccess::load_ptr_acquire(volatile void*       p) { return *(void* volatile *)p; }
72196212Sscottlinline void*    OrderAccess::load_ptr_acquire(const volatile void* p) { return *(void* const volatile *)p; }
73196212Sscottl
74196212Sscottlinline void     OrderAccess::release_store(volatile jbyte*   p, jbyte   v) { *p = v; }
75196212Sscottlinline void     OrderAccess::release_store(volatile jshort*  p, jshort  v) { *p = v; }
76196212Sscottlinline void     OrderAccess::release_store(volatile jint*    p, jint    v) { *p = v; }
77196212Sscottlinline void     OrderAccess::release_store(volatile jlong*   p, jlong   v) { *p = v; }
78196212Sscottlinline void     OrderAccess::release_store(volatile jubyte*  p, jubyte  v) { *p = v; }
79196212Sscottlinline void     OrderAccess::release_store(volatile jushort* p, jushort v) { *p = v; }
80196212Sscottlinline void     OrderAccess::release_store(volatile juint*   p, juint   v) { *p = v; }
81196212Sscottlinline void     OrderAccess::release_store(volatile julong*  p, julong  v) { *p = v; }
82196212Sscottlinline void     OrderAccess::release_store(volatile jfloat*  p, jfloat  v) { *p = v; }
83196212Sscottlinline void     OrderAccess::release_store(volatile jdouble* p, jdouble v) { *p = v; }
84196212Sscottl
85196212Sscottlinline void     OrderAccess::release_store_ptr(volatile intptr_t* p, intptr_t v) { *p = v; }
86196212Sscottlinline void     OrderAccess::release_store_ptr(volatile void*     p, void*    v) { *(void* volatile *)p = v; }
87196212Sscottl
88196212Sscottlinline void     OrderAccess::store_fence(jbyte*  p, jbyte  v) {
89196212Sscottl#ifdef AMD64
90196212Sscottl  *p = v; fence();
91196212Sscottl#else
92196212Sscottl  __asm {
93196212Sscottl    mov edx, p;
94196212Sscottl    mov al, v;
95196212Sscottl    xchg al, byte ptr [edx];
96196212Sscottl  }
97196212Sscottl#endif // AMD64
98196212Sscottl}
99196212Sscottl
100196212Sscottlinline void     OrderAccess::store_fence(jshort* p, jshort v) {
101196212Sscottl#ifdef AMD64
102196212Sscottl  *p = v; fence();
103196212Sscottl#else
104196212Sscottl  __asm {
105196212Sscottl    mov edx, p;
106196212Sscottl    mov ax, v;
107196212Sscottl    xchg ax, word ptr [edx];
108196212Sscottl  }
109196212Sscottl#endif // AMD64
110196212Sscottl}
111196212Sscottl
112196212Sscottlinline void     OrderAccess::store_fence(jint*   p, jint   v) {
113196212Sscottl#ifdef AMD64
114196212Sscottl  *p = v; fence();
115196212Sscottl#else
116196212Sscottl  __asm {
117196212Sscottl    mov edx, p;
118196212Sscottl    mov eax, v;
119196212Sscottl    xchg eax, dword ptr [edx];
120196212Sscottl  }
121196212Sscottl#endif // AMD64
122196212Sscottl}
123196212Sscottl
124196212Sscottlinline void     OrderAccess::store_fence(jlong*   p, jlong   v) { *p = v; fence(); }
125196212Sscottlinline void     OrderAccess::store_fence(jubyte*  p, jubyte  v) { store_fence((jbyte*)p,  (jbyte)v);  }
126196212Sscottlinline void     OrderAccess::store_fence(jushort* p, jushort v) { store_fence((jshort*)p, (jshort)v); }
127196212Sscottlinline void     OrderAccess::store_fence(juint*   p, juint   v) { store_fence((jint*)p,   (jint)v);   }
128196212Sscottlinline void     OrderAccess::store_fence(julong*  p, julong  v) { store_fence((jlong*)p,  (jlong)v);  }
129196212Sscottlinline void     OrderAccess::store_fence(jfloat*  p, jfloat  v) { *p = v; fence(); }
130196212Sscottlinline void     OrderAccess::store_fence(jdouble* p, jdouble v) { *p = v; fence(); }
131196212Sscottl
132196212Sscottlinline void     OrderAccess::store_ptr_fence(intptr_t* p, intptr_t v) {
133196212Sscottl#ifdef AMD64
134196212Sscottl  *p = v; fence();
135196212Sscottl#else
136196212Sscottl  store_fence((jint*)p, (jint)v);
137196212Sscottl#endif // AMD64
138196212Sscottl}
139196212Sscottl
140196212Sscottlinline void     OrderAccess::store_ptr_fence(void**    p, void*    v) {
141196212Sscottl#ifdef AMD64
142196212Sscottl  *p = v; fence();
143196212Sscottl#else
144196212Sscottl  store_fence((jint*)p, (jint)v);
145196212Sscottl#endif // AMD64
146196212Sscottl}
147196212Sscottl
148196212Sscottl// Must duplicate definitions instead of calling store_fence because we don't want to cast away volatile.
149196212Sscottlinline void     OrderAccess::release_store_fence(volatile jbyte*  p, jbyte  v) {
150196212Sscottl#ifdef AMD64
151196212Sscottl  *p = v; fence();
152196212Sscottl#else
153196212Sscottl  __asm {
154196212Sscottl    mov edx, p;
155196212Sscottl    mov al, v;
156196212Sscottl    xchg al, byte ptr [edx];
157196212Sscottl  }
158196212Sscottl#endif // AMD64
159196212Sscottl}
160196212Sscottl
161196212Sscottlinline void     OrderAccess::release_store_fence(volatile jshort* p, jshort v) {
162196212Sscottl#ifdef AMD64
163196212Sscottl  *p = v; fence();
164196212Sscottl#else
165196212Sscottl  __asm {
166196212Sscottl    mov edx, p;
167196212Sscottl    mov ax, v;
168196212Sscottl    xchg ax, word ptr [edx];
169196212Sscottl  }
170196212Sscottl#endif // AMD64
171196212Sscottl}
172196212Sscottl
173196212Sscottlinline void     OrderAccess::release_store_fence(volatile jint*   p, jint   v) {
174196212Sscottl#ifdef AMD64
175196212Sscottl  *p = v; fence();
176196212Sscottl#else
177196212Sscottl  __asm {
178196212Sscottl    mov edx, p;
179    mov eax, v;
180    xchg eax, dword ptr [edx];
181  }
182#endif // AMD64
183}
184
185inline void     OrderAccess::release_store_fence(volatile jlong*   p, jlong   v) { *p = v; fence(); }
186
187inline void     OrderAccess::release_store_fence(volatile jubyte*  p, jubyte  v) { release_store_fence((volatile jbyte*)p,  (jbyte)v);  }
188inline void     OrderAccess::release_store_fence(volatile jushort* p, jushort v) { release_store_fence((volatile jshort*)p, (jshort)v); }
189inline void     OrderAccess::release_store_fence(volatile juint*   p, juint   v) { release_store_fence((volatile jint*)p,   (jint)v);   }
190inline void     OrderAccess::release_store_fence(volatile julong*  p, julong  v) { release_store_fence((volatile jlong*)p,  (jlong)v);  }
191inline void     OrderAccess::release_store_fence(volatile jfloat*  p, jfloat  v) { *p = v; fence(); }
192inline void     OrderAccess::release_store_fence(volatile jdouble* p, jdouble v) { *p = v; fence(); }
193
194inline void     OrderAccess::release_store_ptr_fence(volatile intptr_t* p, intptr_t v) {
195#ifdef AMD64
196  *p = v; fence();
197#else
198  release_store_fence((volatile jint*)p, (jint)v);
199#endif // AMD64
200}
201
202inline void     OrderAccess::release_store_ptr_fence(volatile void*     p, void*    v) {
203#ifdef AMD64
204  *(void* volatile *)p = v; fence();
205#else
206  release_store_fence((volatile jint*)p, (jint)v);
207#endif // AMD64
208}
209
210#pragma warning(default: 4035) // Enables warnings reporting missing return statement
211