7012965: Fix failed on sparc for 7009756: volatile variables could be broken throw reflection API

Tue, 18 Jan 2011 17:10:03 -0800

author
kvn
date
Tue, 18 Jan 2011 17:10:03 -0800
changeset 2460
85c73c0edb06
parent 2459
75efcee5ac47
child 2461
b599a4c6c2df

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

src/os_cpu/solaris_sparc/vm/atomic_solaris_sparc.inline.hpp file | annotate | diff | comparison | revisions
src/os_cpu/solaris_sparc/vm/orderAccess_solaris_sparc.inline.hpp file | annotate | diff | comparison | revisions
src/os_cpu/solaris_sparc/vm/solaris_sparc.il file | annotate | diff | comparison | revisions
     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    //

mercurial