CodeMover prototype
[dyninst.git] / external / boost / detail / atomic_count_gcc_x86.hpp
1 #ifndef BOOST_DETAIL_ATOMIC_COUNT_GCC_X86_HPP_INCLUDED\r
2 #define BOOST_DETAIL_ATOMIC_COUNT_GCC_X86_HPP_INCLUDED\r
3 \r
4 //\r
5 //  boost/detail/atomic_count_gcc_x86.hpp\r
6 //\r
7 //  atomic_count for g++ on 486+/AMD64\r
8 //\r
9 //  Copyright 2007 Peter Dimov\r
10 //\r
11 //  Distributed under the Boost Software License, Version 1.0. (See\r
12 //  accompanying file LICENSE_1_0.txt or copy at\r
13 //  http://www.boost.org/LICENSE_1_0.txt)\r
14 //\r
15 \r
16 namespace boost\r
17 {\r
18 \r
19 namespace detail\r
20 {\r
21 \r
22 class atomic_count\r
23 {\r
24 public:\r
25 \r
26     explicit atomic_count( long v ) : value_( static_cast< int >( v ) ) {}\r
27 \r
28     void operator++()\r
29     {\r
30         __asm__\r
31         (\r
32             "lock\n\t"\r
33             "incl %0":\r
34             "+m"( value_ ): // output (%0)\r
35             : // inputs\r
36             "cc" // clobbers\r
37         );\r
38     }\r
39 \r
40     long operator--()\r
41     {\r
42         return atomic_exchange_and_add( &value_, -1 ) - 1;\r
43     }\r
44 \r
45     operator long() const\r
46     {\r
47         return atomic_exchange_and_add( &value_, 0 );\r
48     }\r
49 \r
50 private:\r
51 \r
52     atomic_count(atomic_count const &);\r
53     atomic_count & operator=(atomic_count const &);\r
54 \r
55     mutable int value_;\r
56 \r
57 private:\r
58 \r
59     static int atomic_exchange_and_add( int * pw, int dv )\r
60     {\r
61         // int r = *pw;\r
62         // *pw += dv;\r
63         // return r;\r
64 \r
65         int r;\r
66 \r
67         __asm__ __volatile__\r
68         (\r
69             "lock\n\t"\r
70             "xadd %1, %0":\r
71             "+m"( *pw ), "=r"( r ): // outputs (%0, %1)\r
72             "1"( dv ): // inputs (%2 == %1)\r
73             "memory", "cc" // clobbers\r
74         );\r
75 \r
76         return r;\r
77     }\r
78 };\r
79 \r
80 } // namespace detail\r
81 \r
82 } // namespace boost\r
83 \r
84 #endif // #ifndef BOOST_DETAIL_ATOMIC_COUNT_SYNC_HPP_INCLUDED\r