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