hotspot/src/os_cpu/linux_x86/vm/orderAccess_linux_x86.inline.hpp
changeset 7885 c02b05ba16a1
parent 7397 5b173b4ca846
child 9409 5bd770036284
equal deleted inserted replaced
7884:10a0fafc26aa 7885:c02b05ba16a1
     1 /*
     1 /*
     2  * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
     2  * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved.
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     4  *
     4  *
     5  * This code is free software; you can redistribute it and/or modify it
     5  * This code is free software; you can redistribute it and/or modify it
     6  * under the terms of the GNU General Public License version 2 only, as
     6  * under the terms of the GNU General Public License version 2 only, as
     7  * published by the Free Software Foundation.
     7  * published by the Free Software Foundation.
    23  */
    23  */
    24 
    24 
    25 #ifndef OS_CPU_LINUX_X86_VM_ORDERACCESS_LINUX_X86_INLINE_HPP
    25 #ifndef OS_CPU_LINUX_X86_VM_ORDERACCESS_LINUX_X86_INLINE_HPP
    26 #define OS_CPU_LINUX_X86_VM_ORDERACCESS_LINUX_X86_INLINE_HPP
    26 #define OS_CPU_LINUX_X86_VM_ORDERACCESS_LINUX_X86_INLINE_HPP
    27 
    27 
       
    28 #include "runtime/atomic.hpp"
    28 #include "runtime/orderAccess.hpp"
    29 #include "runtime/orderAccess.hpp"
    29 #include "vm_version_x86.hpp"
    30 #include "vm_version_x86.hpp"
    30 
    31 
    31 // Implementation of class OrderAccess.
    32 // Implementation of class OrderAccess.
    32 
    33 
    62 }
    63 }
    63 
    64 
    64 inline jbyte    OrderAccess::load_acquire(volatile jbyte*   p) { return *p; }
    65 inline jbyte    OrderAccess::load_acquire(volatile jbyte*   p) { return *p; }
    65 inline jshort   OrderAccess::load_acquire(volatile jshort*  p) { return *p; }
    66 inline jshort   OrderAccess::load_acquire(volatile jshort*  p) { return *p; }
    66 inline jint     OrderAccess::load_acquire(volatile jint*    p) { return *p; }
    67 inline jint     OrderAccess::load_acquire(volatile jint*    p) { return *p; }
    67 inline jlong    OrderAccess::load_acquire(volatile jlong*   p) { return *p; }
    68 inline jlong    OrderAccess::load_acquire(volatile jlong*   p) { return Atomic::load(p); }
    68 inline jubyte   OrderAccess::load_acquire(volatile jubyte*  p) { return *p; }
    69 inline jubyte   OrderAccess::load_acquire(volatile jubyte*  p) { return *p; }
    69 inline jushort  OrderAccess::load_acquire(volatile jushort* p) { return *p; }
    70 inline jushort  OrderAccess::load_acquire(volatile jushort* p) { return *p; }
    70 inline juint    OrderAccess::load_acquire(volatile juint*   p) { return *p; }
    71 inline juint    OrderAccess::load_acquire(volatile juint*   p) { return *p; }
    71 inline julong   OrderAccess::load_acquire(volatile julong*  p) { return *p; }
    72 inline julong   OrderAccess::load_acquire(volatile julong*  p) { return Atomic::load((volatile jlong*)p); }
    72 inline jfloat   OrderAccess::load_acquire(volatile jfloat*  p) { return *p; }
    73 inline jfloat   OrderAccess::load_acquire(volatile jfloat*  p) { return *p; }
    73 inline jdouble  OrderAccess::load_acquire(volatile jdouble* p) { return *p; }
    74 inline jdouble  OrderAccess::load_acquire(volatile jdouble* p) { return *p; }
    74 
    75 
    75 inline intptr_t OrderAccess::load_ptr_acquire(volatile intptr_t*   p) { return *p; }
    76 inline intptr_t OrderAccess::load_ptr_acquire(volatile intptr_t*   p) { return *p; }
    76 inline void*    OrderAccess::load_ptr_acquire(volatile void*       p) { return *(void* volatile *)p; }
    77 inline void*    OrderAccess::load_ptr_acquire(volatile void*       p) { return *(void* volatile *)p; }
    77 inline void*    OrderAccess::load_ptr_acquire(const volatile void* p) { return *(void* const volatile *)p; }
    78 inline void*    OrderAccess::load_ptr_acquire(const volatile void* p) { return *(void* const volatile *)p; }
    78 
    79 
    79 inline void     OrderAccess::release_store(volatile jbyte*   p, jbyte   v) { *p = v; }
    80 inline void     OrderAccess::release_store(volatile jbyte*   p, jbyte   v) { *p = v; }
    80 inline void     OrderAccess::release_store(volatile jshort*  p, jshort  v) { *p = v; }
    81 inline void     OrderAccess::release_store(volatile jshort*  p, jshort  v) { *p = v; }
    81 inline void     OrderAccess::release_store(volatile jint*    p, jint    v) { *p = v; }
    82 inline void     OrderAccess::release_store(volatile jint*    p, jint    v) { *p = v; }
    82 inline void     OrderAccess::release_store(volatile jlong*   p, jlong   v) { *p = v; }
    83 inline void     OrderAccess::release_store(volatile jlong*   p, jlong   v) { Atomic::store(v, p); }
    83 inline void     OrderAccess::release_store(volatile jubyte*  p, jubyte  v) { *p = v; }
    84 inline void     OrderAccess::release_store(volatile jubyte*  p, jubyte  v) { *p = v; }
    84 inline void     OrderAccess::release_store(volatile jushort* p, jushort v) { *p = v; }
    85 inline void     OrderAccess::release_store(volatile jushort* p, jushort v) { *p = v; }
    85 inline void     OrderAccess::release_store(volatile juint*   p, juint   v) { *p = v; }
    86 inline void     OrderAccess::release_store(volatile juint*   p, juint   v) { *p = v; }
    86 inline void     OrderAccess::release_store(volatile julong*  p, julong  v) { *p = v; }
    87 inline void     OrderAccess::release_store(volatile julong*  p, julong  v) { Atomic::store((jlong)v, (volatile jlong*)p); }
    87 inline void     OrderAccess::release_store(volatile jfloat*  p, jfloat  v) { *p = v; }
    88 inline void     OrderAccess::release_store(volatile jfloat*  p, jfloat  v) { *p = v; }
    88 inline void     OrderAccess::release_store(volatile jdouble* p, jdouble v) { *p = v; }
    89 inline void     OrderAccess::release_store(volatile jdouble* p, jdouble v) { *p = v; }
    89 
    90 
    90 inline void     OrderAccess::release_store_ptr(volatile intptr_t* p, intptr_t v) { *p = v; }
    91 inline void     OrderAccess::release_store_ptr(volatile intptr_t* p, intptr_t v) { *p = v; }
    91 inline void     OrderAccess::release_store_ptr(volatile void*     p, void*    v) { *(void* volatile *)p = v; }
    92 inline void     OrderAccess::release_store_ptr(volatile void*     p, void*    v) { *(void* volatile *)p = v; }
   176   __asm__ __volatile__ (  "xchgq (%2), %0"
   177   __asm__ __volatile__ (  "xchgq (%2), %0"
   177                           : "=r" (v)
   178                           : "=r" (v)
   178                           : "0" (v), "r" (p)
   179                           : "0" (v), "r" (p)
   179                           : "memory");
   180                           : "memory");
   180 #else
   181 #else
   181   *p = v; fence();
   182   release_store(p, v); fence();
   182 #endif // AMD64
   183 #endif // AMD64
   183 }
   184 }
   184 
   185 
   185 inline void     OrderAccess::release_store_fence(volatile jubyte*  p, jubyte  v) { release_store_fence((volatile jbyte*)p,  (jbyte)v);  }
   186 inline void     OrderAccess::release_store_fence(volatile jubyte*  p, jubyte  v) { release_store_fence((volatile jbyte*)p,  (jbyte)v);  }
   186 inline void     OrderAccess::release_store_fence(volatile jushort* p, jushort v) { release_store_fence((volatile jshort*)p, (jshort)v); }
   187 inline void     OrderAccess::release_store_fence(volatile jushort* p, jushort v) { release_store_fence((volatile jshort*)p, (jshort)v); }