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) {