src/hotspot/os_cpu/linux_s390/orderAccess_linux_s390.inline.hpp
author eosterlund
Mon, 09 Oct 2017 14:39:59 +0200
changeset 47609 a1f68e415b48
parent 47216 71c04702a3d5
child 49364 601146c66cad
permissions -rw-r--r--
8188813: Generalize OrderAccess to use templates Reviewed-by: dholmes, coleenp
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
     1
/*
46523
cbcc0ebaa044 8166651: OrderAccess::load_acquire &etc should have const parameters
kbarrett
parents: 42065
diff changeset
     2
 * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved.
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
     3
 * Copyright (c) 2016 SAP SE. All rights reserved.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
     4
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
     5
 *
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
     6
 * This code is free software; you can redistribute it and/or modify it
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
     7
 * under the terms of the GNU General Public License version 2 only, as
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
     8
 * published by the Free Software Foundation.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
     9
 *
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    10
 * This code is distributed in the hope that it will be useful, but WITHOUT
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    11
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    12
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    13
 * version 2 for more details (a copy is included in the LICENSE file that
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    14
 * accompanied this code).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    15
 *
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    16
 * You should have received a copy of the GNU General Public License version
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    17
 * 2 along with this work; if not, write to the Free Software Foundation,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    18
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    19
 *
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    20
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    21
 * or visit www.oracle.com if you need additional information or have any
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    22
 * questions.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    23
 *
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    24
 */
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    25
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    26
#ifndef OS_CPU_LINUX_S390_VM_ORDERACCESS_LINUX_S390_INLINE_HPP
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    27
#define OS_CPU_LINUX_S390_VM_ORDERACCESS_LINUX_S390_INLINE_HPP
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    28
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    29
#include "runtime/orderAccess.hpp"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    30
#include "vm_version_s390.hpp"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    31
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    32
// Implementation of class OrderAccess.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    33
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    34
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    35
// machine barrier instructions:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    36
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    37
//   - z_sync            two-way memory barrier, aka fence
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    38
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    39
// semantic barrier instructions:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    40
// (as defined in orderAccess.hpp)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    41
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    42
//   - z_release         orders Store|Store,    (maps to compiler barrier)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    43
//                               Load|Store
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    44
//   - z_acquire         orders  Load|Store,    (maps to compiler barrier)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    45
//                               Load|Load
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    46
//   - z_fence           orders Store|Store,    (maps to z_sync)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    47
//                               Load|Store,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    48
//                               Load|Load,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    49
//                              Store|Load
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    50
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    51
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    52
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    53
// Only load-after-store-order is not guaranteed on z/Architecture, i.e. only 'fence'
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    54
// is needed.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    55
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    56
// A compiler barrier, forcing the C++ compiler to invalidate all memory assumptions.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    57
#define inlasm_compiler_barrier() __asm__ volatile ("" : : : "memory");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    58
// "bcr 15, 0" is used as two way memory barrier.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    59
#define inlasm_zarch_sync() __asm__ __volatile__ ("bcr 15, 0" : : : "memory");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    60
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    61
// Release and acquire are empty on z/Architecture, but potential
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    62
// optimizations of gcc must be forbidden by OrderAccess::release and
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    63
// OrderAccess::acquire.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    64
#define inlasm_zarch_release() inlasm_compiler_barrier()
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    65
#define inlasm_zarch_acquire() inlasm_compiler_barrier()
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    66
#define inlasm_zarch_fence()   inlasm_zarch_sync()
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    67
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    68
inline void OrderAccess::loadload()   { inlasm_compiler_barrier(); }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    69
inline void OrderAccess::storestore() { inlasm_compiler_barrier(); }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    70
inline void OrderAccess::loadstore()  { inlasm_compiler_barrier(); }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    71
inline void OrderAccess::storeload()  { inlasm_zarch_sync(); }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    72
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    73
inline void OrderAccess::acquire()    { inlasm_zarch_acquire(); }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    74
inline void OrderAccess::release()    { inlasm_zarch_release(); }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    75
inline void OrderAccess::fence()      { inlasm_zarch_sync(); }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    76
47609
a1f68e415b48 8188813: Generalize OrderAccess to use templates
eosterlund
parents: 47216
diff changeset
    77
template<size_t byte_size>
a1f68e415b48 8188813: Generalize OrderAccess to use templates
eosterlund
parents: 47216
diff changeset
    78
struct OrderAccess::PlatformOrderedLoad<byte_size, X_ACQUIRE>
a1f68e415b48 8188813: Generalize OrderAccess to use templates
eosterlund
parents: 47216
diff changeset
    79
  VALUE_OBJ_CLASS_SPEC
a1f68e415b48 8188813: Generalize OrderAccess to use templates
eosterlund
parents: 47216
diff changeset
    80
{
a1f68e415b48 8188813: Generalize OrderAccess to use templates
eosterlund
parents: 47216
diff changeset
    81
  template <typename T>
a1f68e415b48 8188813: Generalize OrderAccess to use templates
eosterlund
parents: 47216
diff changeset
    82
  T operator()(const volatile T* p) const { register T t = *p; inlasm_zarch_acquire(); return t; }
a1f68e415b48 8188813: Generalize OrderAccess to use templates
eosterlund
parents: 47216
diff changeset
    83
};
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    84
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    85
#undef inlasm_compiler_barrier
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    86
#undef inlasm_zarch_sync
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    87
#undef inlasm_zarch_release
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    88
#undef inlasm_zarch_acquire
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    89
#undef inlasm_zarch_fence
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    90
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    91
#endif // OS_CPU_LINUX_S390_VM_ORDERACCESS_LINUX_S390_INLINE_HPP