orderAccess_linux_aarch64.inline.hpp revision 11857:d0fbf661cc16
1238384Sjkim/*
2238384Sjkim * Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved.
3238384Sjkim * Copyright (c) 2014, Red Hat Inc. All rights reserved.
4238384Sjkim * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5238384Sjkim *
6238384Sjkim * This code is free software; you can redistribute it and/or modify it
7238384Sjkim * under the terms of the GNU General Public License version 2 only, as
8238384Sjkim * published by the Free Software Foundation.
9238384Sjkim *
10238384Sjkim * This code is distributed in the hope that it will be useful, but WITHOUT
11238384Sjkim * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12238384Sjkim * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
13238384Sjkim * version 2 for more details (a copy is included in the LICENSE file that
14238384Sjkim * accompanied this code).
15238384Sjkim *
16238384Sjkim * You should have received a copy of the GNU General Public License version
17238384Sjkim * 2 along with this work; if not, write to the Free Software Foundation,
18238384Sjkim * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
19238384Sjkim *
20238384Sjkim * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
21238384Sjkim * or visit www.oracle.com if you need additional information or have any
22238384Sjkim * questions.
23238384Sjkim *
24238384Sjkim */
25238384Sjkim
26238384Sjkim#ifndef OS_CPU_LINUX_AARCH64_VM_ORDERACCESS_LINUX_AARCH64_INLINE_HPP
27238384Sjkim#define OS_CPU_LINUX_AARCH64_VM_ORDERACCESS_LINUX_AARCH64_INLINE_HPP
28238384Sjkim
29238384Sjkim#include "runtime/atomic.hpp"
30238384Sjkim#include "runtime/orderAccess.hpp"
31238384Sjkim#include "runtime/os.hpp"
32238384Sjkim#include "vm_version_aarch64.hpp"
33238384Sjkim
34238384Sjkim// Implementation of class OrderAccess.
35238384Sjkim
36238384Sjkiminline void OrderAccess::loadload()   { acquire(); }
37238384Sjkiminline void OrderAccess::storestore() { release(); }
38238384Sjkiminline void OrderAccess::loadstore()  { acquire(); }
39238384Sjkiminline void OrderAccess::storeload()  { fence(); }
40238384Sjkim
41238384Sjkiminline void OrderAccess::acquire() {
42238384Sjkim  READ_MEM_BARRIER;
43238384Sjkim}
44238384Sjkim
45238384Sjkiminline void OrderAccess::release() {
46238384Sjkim  WRITE_MEM_BARRIER;
47238384Sjkim}
48238384Sjkim
49238384Sjkiminline void OrderAccess::fence() {
50238384Sjkim  FULL_MEM_BARRIER;
51238384Sjkim}
52238384Sjkim
53238384Sjkiminline jbyte    OrderAccess::load_acquire(volatile jbyte*   p)
54238384Sjkim{ jbyte data; __atomic_load(p, &data, __ATOMIC_ACQUIRE); return data; }
55238384Sjkiminline jshort   OrderAccess::load_acquire(volatile jshort*  p)
56238384Sjkim{ jshort data; __atomic_load(p, &data, __ATOMIC_ACQUIRE); return data; }
57238384Sjkiminline jint     OrderAccess::load_acquire(volatile jint*    p)
58238384Sjkim{ jint data; __atomic_load(p, &data, __ATOMIC_ACQUIRE); return data; }
59238384Sjkiminline jlong    OrderAccess::load_acquire(volatile jlong*   p)
60238384Sjkim{ jlong data; __atomic_load(p, &data, __ATOMIC_ACQUIRE); return data; }
61238384Sjkiminline jubyte    OrderAccess::load_acquire(volatile jubyte*   p)
62238384Sjkim{ jubyte data; __atomic_load(p, &data, __ATOMIC_ACQUIRE); return data; }
63238384Sjkiminline jushort   OrderAccess::load_acquire(volatile jushort*  p)
64238384Sjkim{ jushort data; __atomic_load(p, &data, __ATOMIC_ACQUIRE); return data; }
65238384Sjkiminline juint     OrderAccess::load_acquire(volatile juint*    p)
66238384Sjkim{ juint data; __atomic_load(p, &data, __ATOMIC_ACQUIRE); return data; }
67238384Sjkiminline julong   OrderAccess::load_acquire(volatile julong*  p)
68238384Sjkim{ julong data; __atomic_load(p, &data, __ATOMIC_ACQUIRE); return data; }
69238384Sjkiminline jfloat   OrderAccess::load_acquire(volatile jfloat*  p)
70238384Sjkim{ jfloat data; __atomic_load(p, &data, __ATOMIC_ACQUIRE); return data; }
71238384Sjkiminline jdouble  OrderAccess::load_acquire(volatile jdouble* p)
72238384Sjkim{ jdouble data; __atomic_load(p, &data, __ATOMIC_ACQUIRE); return data; }
73238384Sjkiminline intptr_t OrderAccess::load_ptr_acquire(volatile intptr_t*   p)
74238384Sjkim{ intptr_t data; __atomic_load(p, &data, __ATOMIC_ACQUIRE); return data; }
75238384Sjkiminline void*    OrderAccess::load_ptr_acquire(volatile void*       p)
76238384Sjkim{ void* data; __atomic_load((void* volatile *)p, &data, __ATOMIC_ACQUIRE); return data; }
77238384Sjkiminline void*    OrderAccess::load_ptr_acquire(const volatile void* p)
78238384Sjkim{ void* data; __atomic_load((void* const volatile *)p, &data, __ATOMIC_ACQUIRE); return data; }
79238384Sjkim
80238384Sjkiminline void     OrderAccess::release_store(volatile jbyte*   p, jbyte   v)
81238384Sjkim{ __atomic_store(p, &v, __ATOMIC_RELEASE); }
82238384Sjkiminline void     OrderAccess::release_store(volatile jshort*  p, jshort  v)
83238384Sjkim{ __atomic_store(p, &v, __ATOMIC_RELEASE); }
84238384Sjkiminline void     OrderAccess::release_store(volatile jint*    p, jint    v)
85238384Sjkim{ __atomic_store(p, &v, __ATOMIC_RELEASE); }
86238384Sjkiminline void     OrderAccess::release_store(volatile jlong*   p, jlong   v)
87238384Sjkim{ __atomic_store(p, &v, __ATOMIC_RELEASE); }
88238384Sjkiminline void     OrderAccess::release_store(volatile jubyte*  p, jubyte  v)
89238384Sjkim{ __atomic_store(p, &v, __ATOMIC_RELEASE); }
90238384Sjkiminline void     OrderAccess::release_store(volatile jushort* p, jushort v)
91238384Sjkim{ __atomic_store(p, &v, __ATOMIC_RELEASE); }
92238384Sjkiminline void     OrderAccess::release_store(volatile juint*   p, juint   v)
93238384Sjkim{ __atomic_store(p, &v, __ATOMIC_RELEASE); }
94238384Sjkiminline void     OrderAccess::release_store(volatile julong*  p, julong  v)
95238384Sjkim{ __atomic_store(p, &v, __ATOMIC_RELEASE); }
96238384Sjkiminline void     OrderAccess::release_store(volatile jfloat*  p, jfloat  v)
97238384Sjkim{ __atomic_store(p, &v, __ATOMIC_RELEASE); }
98238384Sjkiminline void     OrderAccess::release_store(volatile jdouble* p, jdouble v)
99238384Sjkim{ __atomic_store(p, &v, __ATOMIC_RELEASE); }
100238384Sjkiminline void     OrderAccess::release_store_ptr(volatile intptr_t* p, intptr_t v)
101238384Sjkim{ __atomic_store(p, &v, __ATOMIC_RELEASE); }
102238384Sjkiminline void     OrderAccess::release_store_ptr(volatile void*     p, void*    v)
103238384Sjkim{ __atomic_store((void* volatile *)p, &v, __ATOMIC_RELEASE); }
104238384Sjkim
105238384Sjkiminline void     OrderAccess::store_fence(jbyte*   p, jbyte   v)
106238384Sjkim{ __atomic_store(p, &v, __ATOMIC_RELAXED); fence(); }
107238384Sjkiminline void     OrderAccess::store_fence(jshort*  p, jshort  v)
108238384Sjkim{ __atomic_store(p, &v, __ATOMIC_RELAXED); fence(); }
109238384Sjkiminline void     OrderAccess::store_fence(jint*    p, jint    v)
110238384Sjkim{ __atomic_store(p, &v, __ATOMIC_RELAXED); fence(); }
111238384Sjkiminline void     OrderAccess::store_fence(jlong*   p, jlong   v)
112238384Sjkim{ __atomic_store(p, &v, __ATOMIC_RELAXED); fence(); }
113238384Sjkiminline void     OrderAccess::store_fence(jubyte*  p, jubyte  v)
114238384Sjkim{ __atomic_store(p, &v, __ATOMIC_RELAXED); fence(); }
115238384Sjkiminline void     OrderAccess::store_fence(jushort* p, jushort v)
116238384Sjkim{ __atomic_store(p, &v, __ATOMIC_RELAXED); fence(); }
117238384Sjkiminline void     OrderAccess::store_fence(juint*   p, juint   v)
118238384Sjkim{ __atomic_store(p, &v, __ATOMIC_RELAXED); fence(); }
119238384Sjkiminline void     OrderAccess::store_fence(julong*  p, julong  v)
120238384Sjkim{ __atomic_store(p, &v, __ATOMIC_RELAXED); fence(); }
121238384Sjkiminline void     OrderAccess::store_fence(jfloat*  p, jfloat  v)
122238384Sjkim{ __atomic_store(p, &v, __ATOMIC_RELAXED); fence(); }
123238384Sjkiminline void     OrderAccess::store_fence(jdouble* p, jdouble v)
124238384Sjkim{ __atomic_store(p, &v, __ATOMIC_RELAXED); fence(); }
125238384Sjkiminline void     OrderAccess::store_ptr_fence(intptr_t* p, intptr_t v)
126238384Sjkim{ __atomic_store(p, &v, __ATOMIC_RELAXED); fence(); }
127238384Sjkiminline void     OrderAccess::store_ptr_fence(void**    p, void*    v)
128238384Sjkim{ __atomic_store(p, &v, __ATOMIC_RELAXED); fence(); }
129238384Sjkim
130238384Sjkiminline void     OrderAccess::release_store_fence(volatile jbyte*   p, jbyte   v) { release_store(p, v); fence(); }
131238384Sjkiminline void     OrderAccess::release_store_fence(volatile jshort*  p, jshort  v) { release_store(p, v); fence(); }
132238384Sjkiminline void     OrderAccess::release_store_fence(volatile jint*    p, jint    v) { release_store(p, v); fence(); }
133238384Sjkiminline void     OrderAccess::release_store_fence(volatile jlong*   p, jlong   v) { release_store(p, v); fence(); }
134238384Sjkiminline void     OrderAccess::release_store_fence(volatile jubyte*  p, jubyte  v) { release_store(p, v); fence(); }
135238384Sjkiminline void     OrderAccess::release_store_fence(volatile jushort* p, jushort v) { release_store(p, v); fence(); }
136238384Sjkiminline void     OrderAccess::release_store_fence(volatile juint*   p, juint   v) { release_store(p, v); fence(); }
137238384Sjkiminline void     OrderAccess::release_store_fence(volatile julong*  p, julong  v) { release_store(p, v); fence(); }
138238384Sjkiminline void     OrderAccess::release_store_fence(volatile jfloat*  p, jfloat  v) { release_store(p, v); fence(); }
139238384Sjkiminline void     OrderAccess::release_store_fence(volatile jdouble* p, jdouble v) { release_store(p, v); fence(); }
140238384Sjkim
141238384Sjkiminline void     OrderAccess::release_store_ptr_fence(volatile intptr_t* p, intptr_t v) { release_store_ptr(p, v); fence(); }
142238384Sjkiminline void     OrderAccess::release_store_ptr_fence(volatile void*     p, void*    v) { release_store_ptr(p, v); fence(); }
143238384Sjkim
144238384Sjkim#endif // OS_CPU_LINUX_AARCH64_VM_ORDERACCESS_LINUX_AARCH64_INLINE_HPP
145238384Sjkim