hotspot/src/os_cpu/linux_s390/vm/orderAccess_linux_s390.inline.hpp
author goetz
Thu, 13 Oct 2016 14:49:34 +0200
changeset 42065 6032b31e3719
child 46523 cbcc0ebaa044
permissions -rw-r--r--
8167673: [s390] The s390 port. Summary: template interpreter, C1, C2 Reviewed-by: kvn, simonis
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
     1
/*
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
     2
 * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
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
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    77
template<> inline jbyte  OrderAccess::specialized_load_acquire<jbyte> (volatile jbyte*  p) { register jbyte  t = *p; inlasm_zarch_acquire(); return t; }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    78
template<> inline jshort OrderAccess::specialized_load_acquire<jshort>(volatile jshort* p) { register jshort t = *p; inlasm_zarch_acquire(); return t; }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    79
template<> inline jint   OrderAccess::specialized_load_acquire<jint>  (volatile jint*   p) { register jint   t = *p; inlasm_zarch_acquire(); return t; }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    80
template<> inline jlong  OrderAccess::specialized_load_acquire<jlong> (volatile jlong*  p) { register jlong  t = *p; inlasm_zarch_acquire(); return t; }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    81
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    82
#undef inlasm_compiler_barrier
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    83
#undef inlasm_zarch_sync
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    84
#undef inlasm_zarch_release
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    85
#undef inlasm_zarch_acquire
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    86
#undef inlasm_zarch_fence
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    87
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    88
#define VM_HAS_GENERALIZED_ORDER_ACCESS 1
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    89
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    90
#endif // OS_CPU_LINUX_S390_VM_ORDERACCESS_LINUX_S390_INLINE_HPP
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    91
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    92