Tue, 18 Jan 2011 17:10:03 -0800
7012965: Fix failed on sparc for 7009756: volatile variables could be broken throw reflection API
Summary: Use LDX/STX on v9 and LDD/STD on v8 sparc for volatile long moves.
Reviewed-by: never
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) {
2.1 --- a/src/os_cpu/solaris_sparc/vm/orderAccess_solaris_sparc.inline.hpp Thu Oct 07 13:49:40 2010 -0700 2.2 +++ b/src/os_cpu/solaris_sparc/vm/orderAccess_solaris_sparc.inline.hpp Tue Jan 18 17:10:03 2011 -0800 2.3 @@ -1,5 +1,5 @@ 2.4 /* 2.5 - * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. 2.6 + * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. 2.7 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 2.8 * 2.9 * This code is free software; you can redistribute it and/or modify it 2.10 @@ -77,11 +77,11 @@ 2.11 inline jbyte OrderAccess::load_acquire(volatile jbyte* p) { return *p; } 2.12 inline jshort OrderAccess::load_acquire(volatile jshort* p) { return *p; } 2.13 inline jint OrderAccess::load_acquire(volatile jint* p) { return *p; } 2.14 -inline jlong OrderAccess::load_acquire(volatile jlong* p) { return *p; } 2.15 +inline jlong OrderAccess::load_acquire(volatile jlong* p) { return Atomic::load(p); } 2.16 inline jubyte OrderAccess::load_acquire(volatile jubyte* p) { return *p; } 2.17 inline jushort OrderAccess::load_acquire(volatile jushort* p) { return *p; } 2.18 inline juint OrderAccess::load_acquire(volatile juint* p) { return *p; } 2.19 -inline julong OrderAccess::load_acquire(volatile julong* p) { return *p; } 2.20 +inline julong OrderAccess::load_acquire(volatile julong* p) { return Atomic::load((volatile jlong*)p); } 2.21 inline jfloat OrderAccess::load_acquire(volatile jfloat* p) { return *p; } 2.22 inline jdouble OrderAccess::load_acquire(volatile jdouble* p) { return *p; } 2.23 2.24 @@ -92,11 +92,11 @@ 2.25 inline void OrderAccess::release_store(volatile jbyte* p, jbyte v) { *p = v; } 2.26 inline void OrderAccess::release_store(volatile jshort* p, jshort v) { *p = v; } 2.27 inline void OrderAccess::release_store(volatile jint* p, jint v) { *p = v; } 2.28 -inline void OrderAccess::release_store(volatile jlong* p, jlong v) { *p = v; } 2.29 +inline void OrderAccess::release_store(volatile jlong* p, jlong v) { Atomic::store(v, p); } 2.30 inline void OrderAccess::release_store(volatile jubyte* p, jubyte v) { *p = v; } 2.31 inline void OrderAccess::release_store(volatile jushort* p, jushort v) { *p = v; } 2.32 inline void OrderAccess::release_store(volatile juint* p, juint v) { *p = v; } 2.33 -inline void OrderAccess::release_store(volatile julong* p, julong v) { *p = v; } 2.34 +inline void OrderAccess::release_store(volatile julong* p, julong v) { Atomic::store((jlong)v, (volatile jlong*)p); } 2.35 inline void OrderAccess::release_store(volatile jfloat* p, jfloat v) { *p = v; } 2.36 inline void OrderAccess::release_store(volatile jdouble* p, jdouble v) { *p = v; } 2.37 2.38 @@ -120,11 +120,11 @@ 2.39 inline void OrderAccess::release_store_fence(volatile jbyte* p, jbyte v) { *p = v; fence(); } 2.40 inline void OrderAccess::release_store_fence(volatile jshort* p, jshort v) { *p = v; fence(); } 2.41 inline void OrderAccess::release_store_fence(volatile jint* p, jint v) { *p = v; fence(); } 2.42 -inline void OrderAccess::release_store_fence(volatile jlong* p, jlong v) { *p = v; fence(); } 2.43 +inline void OrderAccess::release_store_fence(volatile jlong* p, jlong v) { release_store(p, v); fence(); } 2.44 inline void OrderAccess::release_store_fence(volatile jubyte* p, jubyte v) { *p = v; fence(); } 2.45 inline void OrderAccess::release_store_fence(volatile jushort* p, jushort v) { *p = v; fence(); } 2.46 inline void OrderAccess::release_store_fence(volatile juint* p, juint v) { *p = v; fence(); } 2.47 -inline void OrderAccess::release_store_fence(volatile julong* p, julong v) { *p = v; fence(); } 2.48 +inline void OrderAccess::release_store_fence(volatile julong* p, julong v) { release_store(p, v); fence(); } 2.49 inline void OrderAccess::release_store_fence(volatile jfloat* p, jfloat v) { *p = v; fence(); } 2.50 inline void OrderAccess::release_store_fence(volatile jdouble* p, jdouble v) { *p = v; fence(); } 2.51
3.1 --- a/src/os_cpu/solaris_sparc/vm/solaris_sparc.il Thu Oct 07 13:49:40 2010 -0700 3.2 +++ b/src/os_cpu/solaris_sparc/vm/solaris_sparc.il Tue Jan 18 17:10:03 2011 -0800 3.3 @@ -1,5 +1,5 @@ 3.4 // 3.5 -// Copyright (c) 2002, 2005, Oracle and/or its affiliates. All rights reserved. 3.6 +// Copyright (c) 2002, 2011, Oracle and/or its affiliates. All rights reserved. 3.7 // DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 3.8 // 3.9 // This code is free software; you can redistribute it and/or modify it 3.10 @@ -152,6 +152,39 @@ 3.11 .nonvolatile 3.12 .end 3.13 3.14 + // Support for jlong Atomic::load and Atomic::store on v8. 3.15 + // 3.16 + // void _Atomic_move_long_v8(volatile jlong* src, volatile jlong* dst) 3.17 + // 3.18 + // Arguments: 3.19 + // src: O0 3.20 + // dest: O1 3.21 + // 3.22 + // Overwrites O2 and O3 3.23 + 3.24 + .inline _Atomic_move_long_v8,2 3.25 + .volatile 3.26 + ldd [%o0], %o2 3.27 + std %o2, [%o1] 3.28 + .nonvolatile 3.29 + .end 3.30 + 3.31 + // Support for jlong Atomic::load and Atomic::store on v9. 3.32 + // 3.33 + // void _Atomic_move_long_v9(volatile jlong* src, volatile jlong* dst) 3.34 + // 3.35 + // Arguments: 3.36 + // src: O0 3.37 + // dest: O1 3.38 + // 3.39 + // Overwrites O2 3.40 + 3.41 + .inline _Atomic_move_long_v9,2 3.42 + .volatile 3.43 + ldx [%o0], %o2 3.44 + stx %o2, [%o1] 3.45 + .nonvolatile 3.46 + .end 3.47 3.48 // Support for jint Atomic::add(jint add_value, volatile jint* dest). 3.49 //