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"
|