< prev index next >

src/os_cpu/bsd_x86/vm/atomic_bsd_x86.hpp

Print this page
rev 13452 : imported patch Atomic_cmpxchg
rev 13453 : imported patch Atomic_add
rev 13454 : [mq]: Atomic_add_v2


  44 struct Atomic::PlatformAdd
  45   : Atomic::FetchAndAdd<Atomic::PlatformAdd<byte_size> >
  46 {
  47   template<typename I, typename D>
  48   D fetch_and_add(I add_value, D volatile* dest) const;
  49 };
  50 
  51 template<>
  52 template<typename I, typename D>
  53 inline D Atomic::PlatformAdd<4>::fetch_and_add(I add_value, D volatile* dest) const {
  54   STATIC_ASSERT(4 == sizeof(I));
  55   STATIC_ASSERT(4 == sizeof(D));
  56   D old_value;
  57   __asm__ volatile (  "lock xaddl %0,(%2)"
  58                     : "=r" (old_value)
  59                     : "0" (add_value), "r" (dest)
  60                     : "cc", "memory");
  61   return old_value;
  62 }
  63 



  64 inline void Atomic::inc    (volatile jint*     dest) {
  65   __asm__ volatile (  "lock addl $1,(%0)" :
  66                     : "r" (dest) : "cc", "memory");
  67 }
  68 
  69 inline void Atomic::inc_ptr(volatile void*     dest) {
  70   inc_ptr((volatile intptr_t*)dest);
  71 }
  72 
  73 inline void Atomic::dec    (volatile jint*     dest) {
  74   __asm__ volatile (  "lock subl $1,(%0)" :
  75                     : "r" (dest) : "cc", "memory");
  76 }
  77 
  78 inline void Atomic::dec_ptr(volatile void*     dest) {
  79   dec_ptr((volatile intptr_t*)dest);
  80 }
  81 
  82 inline jint     Atomic::xchg    (jint     exchange_value, volatile jint*     dest) {
  83   __asm__ volatile (  "xchgl (%2),%0"




  44 struct Atomic::PlatformAdd
  45   : Atomic::FetchAndAdd<Atomic::PlatformAdd<byte_size> >
  46 {
  47   template<typename I, typename D>
  48   D fetch_and_add(I add_value, D volatile* dest) const;
  49 };
  50 
  51 template<>
  52 template<typename I, typename D>
  53 inline D Atomic::PlatformAdd<4>::fetch_and_add(I add_value, D volatile* dest) const {
  54   STATIC_ASSERT(4 == sizeof(I));
  55   STATIC_ASSERT(4 == sizeof(D));
  56   D old_value;
  57   __asm__ volatile (  "lock xaddl %0,(%2)"
  58                     : "=r" (old_value)
  59                     : "0" (add_value), "r" (dest)
  60                     : "cc", "memory");
  61   return old_value;
  62 }
  63 
  64 template<>
  65 struct Atomic::PlatformAdd<2>: Atomic::AddShortUsingInt {};
  66 
  67 inline void Atomic::inc    (volatile jint*     dest) {
  68   __asm__ volatile (  "lock addl $1,(%0)" :
  69                     : "r" (dest) : "cc", "memory");
  70 }
  71 
  72 inline void Atomic::inc_ptr(volatile void*     dest) {
  73   inc_ptr((volatile intptr_t*)dest);
  74 }
  75 
  76 inline void Atomic::dec    (volatile jint*     dest) {
  77   __asm__ volatile (  "lock subl $1,(%0)" :
  78                     : "r" (dest) : "cc", "memory");
  79 }
  80 
  81 inline void Atomic::dec_ptr(volatile void*     dest) {
  82   dec_ptr((volatile intptr_t*)dest);
  83 }
  84 
  85 inline jint     Atomic::xchg    (jint     exchange_value, volatile jint*     dest) {
  86   __asm__ volatile (  "xchgl (%2),%0"


< prev index next >