55 |
55 |
56 template<size_t byte_size> |
56 template<size_t byte_size> |
57 struct Atomic::PlatformAdd |
57 struct Atomic::PlatformAdd |
58 : Atomic::AddAndFetch<Atomic::PlatformAdd<byte_size> > |
58 : Atomic::AddAndFetch<Atomic::PlatformAdd<byte_size> > |
59 { |
59 { |
60 template<typename I, typename D> |
60 template<typename D, typename I> |
61 D add_and_fetch(I add_value, D volatile* dest, atomic_memory_order order) const; |
61 D add_and_fetch(D volatile* dest, I add_value, atomic_memory_order order) const; |
62 }; |
62 }; |
63 |
63 |
64 #ifdef AMD64 |
64 #ifdef AMD64 |
65 template<> |
65 template<> |
66 template<typename I, typename D> |
66 template<typename D, typename I> |
67 inline D Atomic::PlatformAdd<4>::add_and_fetch(I add_value, D volatile* dest, |
67 inline D Atomic::PlatformAdd<4>::add_and_fetch(D volatile* dest, I add_value, |
68 atomic_memory_order order) const { |
68 atomic_memory_order order) const { |
69 return add_using_helper<int32_t>(os::atomic_add_func, add_value, dest); |
69 return add_using_helper<int32_t>(os::atomic_add_func, dest, add_value); |
70 } |
70 } |
71 |
71 |
72 template<> |
72 template<> |
73 template<typename I, typename D> |
73 template<typename D, typename I> |
74 inline D Atomic::PlatformAdd<8>::add_and_fetch(I add_value, D volatile* dest, |
74 inline D Atomic::PlatformAdd<8>::add_and_fetch(D volatile* dest, I add_value, |
75 atomic_memory_order order) const { |
75 atomic_memory_order order) const { |
76 return add_using_helper<int64_t>(os::atomic_add_long_func, add_value, dest); |
76 return add_using_helper<int64_t>(os::atomic_add_long_func, dest, add_value); |
77 } |
77 } |
78 |
78 |
79 #define DEFINE_STUB_XCHG(ByteSize, StubType, StubName) \ |
79 #define DEFINE_STUB_XCHG(ByteSize, StubType, StubName) \ |
80 template<> \ |
80 template<> \ |
81 template<typename T> \ |
81 template<typename T> \ |
109 #undef DEFINE_STUB_CMPXCHG |
109 #undef DEFINE_STUB_CMPXCHG |
110 |
110 |
111 #else // !AMD64 |
111 #else // !AMD64 |
112 |
112 |
113 template<> |
113 template<> |
114 template<typename I, typename D> |
114 template<typename D, typename I> |
115 inline D Atomic::PlatformAdd<4>::add_and_fetch(I add_value, D volatile* dest, |
115 inline D Atomic::PlatformAdd<4>::add_and_fetch(D volatile* dest, I add_value, |
116 atomic_memory_order order) const { |
116 atomic_memory_order order) const { |
117 STATIC_ASSERT(4 == sizeof(I)); |
117 STATIC_ASSERT(4 == sizeof(I)); |
118 STATIC_ASSERT(4 == sizeof(D)); |
118 STATIC_ASSERT(4 == sizeof(D)); |
119 __asm { |
119 __asm { |
120 mov edx, dest; |
120 mov edx, dest; |