< prev index next >
src/hotspot/os_cpu/linux_ppc/atomic_linux_ppc.hpp
Print this page
rev 54056 : 8220441: [PPC64] Clobber memory effect missing for memory barriers in atomics
Reviewed-by:
*** 1,8 ****
/*
* Copyright (c) 1997, 2019, Oracle and/or its affiliates. All rights reserved.
! * Copyright (c) 2012, 2018 SAP SE. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
--- 1,8 ----
/*
* Copyright (c) 1997, 2019, Oracle and/or its affiliates. All rights reserved.
! * Copyright (c) 2012, 2019 SAP SE. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*** 28,37 ****
--- 28,39 ----
#ifndef PPC64
#error "Atomic currently only implemented for PPC64"
#endif
+ #include "utilities/debug.hpp"
+
// Implementation of class atomic
//
// machine barrier instructions:
//
*** 66,101 ****
// Load|Store,
// Load|Load,
// Store|Load
//
- #define strasm_sync "\n sync \n"
- #define strasm_lwsync "\n lwsync \n"
- #define strasm_isync "\n isync \n"
- #define strasm_release strasm_lwsync
- #define strasm_acquire strasm_lwsync
- #define strasm_fence strasm_sync
- #define strasm_nobarrier ""
- #define strasm_nobarrier_clobber_memory ""
-
inline void pre_membar(atomic_memory_order order) {
switch (order) {
case memory_order_relaxed:
case memory_order_acquire: break;
case memory_order_release:
! case memory_order_acq_rel: __asm__ __volatile__ (strasm_lwsync); break;
! default /*conservative*/ : __asm__ __volatile__ (strasm_sync); break;
}
}
inline void post_membar(atomic_memory_order order) {
switch (order) {
case memory_order_relaxed:
case memory_order_release: break;
case memory_order_acquire:
! case memory_order_acq_rel: __asm__ __volatile__ (strasm_isync); break;
! default /*conservative*/ : __asm__ __volatile__ (strasm_sync); break;
}
}
template<size_t byte_size>
--- 68,94 ----
// Load|Store,
// Load|Load,
// Store|Load
//
inline void pre_membar(atomic_memory_order order) {
switch (order) {
case memory_order_relaxed:
case memory_order_acquire: break;
case memory_order_release:
! case memory_order_acq_rel: __asm__ __volatile__ ("lwsync" : : : "memory"); break;
! default /*conservative*/ : __asm__ __volatile__ ("sync" : : : "memory"); break;
}
}
inline void post_membar(atomic_memory_order order) {
switch (order) {
case memory_order_relaxed:
case memory_order_release: break;
case memory_order_acquire:
! case memory_order_acq_rel: __asm__ __volatile__ ("isync" : : : "memory"); break;
! default /*conservative*/ : __asm__ __volatile__ ("sync" : : : "memory"); break;
}
}
template<size_t byte_size>
*** 404,418 ****
post_membar(order);
return old_value;
}
- #undef strasm_sync
- #undef strasm_lwsync
- #undef strasm_isync
- #undef strasm_release
- #undef strasm_acquire
- #undef strasm_fence
- #undef strasm_nobarrier
- #undef strasm_nobarrier_clobber_memory
-
#endif // OS_CPU_LINUX_PPC_ATOMIC_LINUX_PPC_HPP
--- 397,402 ----
< prev index next >