src/os_cpu/solaris_sparc/vm/atomic_solaris_sparc.inline.hpp

changeset 2460
85c73c0edb06
parent 2314
f95d63e2154a
child 2557
f7de3327c683
     1.1 --- a/src/os_cpu/solaris_sparc/vm/atomic_solaris_sparc.inline.hpp	Thu Oct 07 13:49:40 2010 -0700
     1.2 +++ b/src/os_cpu/solaris_sparc/vm/atomic_solaris_sparc.inline.hpp	Tue Jan 18 17:10:03 2011 -0800
     1.3 @@ -1,5 +1,5 @@
     1.4  /*
     1.5 - * Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
     1.6 + * Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved.
     1.7   * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     1.8   *
     1.9   * This code is free software; you can redistribute it and/or modify it
    1.10 @@ -35,14 +35,12 @@
    1.11  inline void Atomic::store    (jbyte    store_value, jbyte*    dest) { *dest = store_value; }
    1.12  inline void Atomic::store    (jshort   store_value, jshort*   dest) { *dest = store_value; }
    1.13  inline void Atomic::store    (jint     store_value, jint*     dest) { *dest = store_value; }
    1.14 -inline void Atomic::store    (jlong    store_value, jlong*    dest) { *dest = store_value; }
    1.15  inline void Atomic::store_ptr(intptr_t store_value, intptr_t* dest) { *dest = store_value; }
    1.16  inline void Atomic::store_ptr(void*    store_value, void*     dest) { *(void**)dest = store_value; }
    1.17  
    1.18  inline void Atomic::store    (jbyte    store_value, volatile jbyte*    dest) { *dest = store_value; }
    1.19  inline void Atomic::store    (jshort   store_value, volatile jshort*   dest) { *dest = store_value; }
    1.20  inline void Atomic::store    (jint     store_value, volatile jint*     dest) { *dest = store_value; }
    1.21 -inline void Atomic::store    (jlong    store_value, volatile jlong*    dest) { *dest = store_value; }
    1.22  inline void Atomic::store_ptr(intptr_t store_value, volatile intptr_t* dest) { *dest = store_value; }
    1.23  inline void Atomic::store_ptr(void*    store_value, volatile void*     dest) { *(void* volatile *)dest = store_value; }
    1.24  
    1.25 @@ -54,8 +52,49 @@
    1.26  inline void Atomic::dec_ptr(volatile intptr_t* dest) { (void)add_ptr(-1, dest); }
    1.27  inline void Atomic::dec_ptr(volatile void*     dest) { (void)add_ptr(-1, dest); }
    1.28  
    1.29 +
    1.30 +#ifdef _LP64
    1.31 +
    1.32 +inline void Atomic::store(jlong store_value, jlong* dest) { *dest = store_value; }
    1.33 +inline void Atomic::store(jlong store_value, volatile jlong* dest) { *dest = store_value; }
    1.34  inline jlong Atomic::load(volatile jlong* src) { return *src; }
    1.35  
    1.36 +#else
    1.37 +
    1.38 +extern "C" void _Atomic_move_long_v8(volatile jlong* src, volatile jlong* dst);
    1.39 +extern "C" void _Atomic_move_long_v9(volatile jlong* src, volatile jlong* dst);
    1.40 +
    1.41 +inline void Atomic_move_long(volatile jlong* src, volatile jlong* dst) {
    1.42 +#ifdef COMPILER2
    1.43 +  // Compiler2 does not support v8, it is used only for v9.
    1.44 +  assert (VM_Version::v9_instructions_work(), "only supported on v9");
    1.45 +  _Atomic_move_long_v9(src, dst);
    1.46 +#else
    1.47 +  // The branch is cheaper then emulated LDD.
    1.48 +  if (VM_Version::v9_instructions_work()) {
    1.49 +    _Atomic_move_long_v9(src, dst);
    1.50 +  } else {
    1.51 +    _Atomic_move_long_v8(src, dst);
    1.52 +  }
    1.53 +#endif
    1.54 +}
    1.55 +
    1.56 +inline jlong Atomic::load(volatile jlong* src) {
    1.57 +  volatile jlong dest;
    1.58 +  Atomic_move_long(src, &dest);
    1.59 +  return dest;
    1.60 +}
    1.61 +
    1.62 +inline void Atomic::store(jlong store_value, jlong* dest) {
    1.63 +  Atomic_move_long((volatile jlong*)&store_value, (volatile jlong*)dest);
    1.64 +}
    1.65 +
    1.66 +inline void Atomic::store(jlong store_value, volatile jlong* dest) {
    1.67 +  Atomic_move_long((volatile jlong*)&store_value, dest);
    1.68 +}
    1.69 +
    1.70 +#endif
    1.71 +
    1.72  #ifdef _GNU_SOURCE
    1.73  
    1.74  inline jint     Atomic::add    (jint     add_value, volatile jint*     dest) {

mercurial