OSDN Git Service

cba24043021112b8406fdbe293f478a2b8a96b63
[pf3gnuchains/gcc-fork.git] / libstdc++-v3 / config / cpu / sh / atomicity.h
1 // Low-level functions for atomic operations: Generic version  -*- C++ -*-
2
3 // Copyright (C) 1999, 2001, 2002, 2003 Free Software Foundation, Inc.
4 //
5 // This file is part of the GNU ISO C++ Library.  This library is free
6 // software; you can redistribute it and/or modify it under the
7 // terms of the GNU General Public License as published by the
8 // Free Software Foundation; either version 2, or (at your option)
9 // any later version.
10
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 // GNU General Public License for more details.
15
16 // You should have received a copy of the GNU General Public License along
17 // with this library; see the file COPYING.  If not, write to the Free
18 // Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
19 // USA.
20
21 // As a special exception, you may use this file as part of a free software
22 // library without restriction.  Specifically, if other files instantiate
23 // templates or use macros or inline functions from this file, or you compile
24 // this file and link it with other files to produce an executable, this
25 // file does not by itself cause the resulting executable to be covered by
26 // the GNU General Public License.  This exception does not however
27 // invalidate any other reasons why the executable file might be covered by
28 // the GNU General Public License.
29
30 #ifndef _BITS_ATOMICITY_H
31 #define _BITS_ATOMICITY_H       1
32
33 #ifdef __SH4A__
34
35 typedef int _Atomic_word;
36
37 static inline _Atomic_word
38 __attribute__ ((__unused__))
39 __exchange_and_add (volatile _Atomic_word* __mem, int __val)
40 {
41   _Atomic_word __result;
42
43   __asm__ __volatile__
44     ("0:\n"
45      "\tmovli.l\t@%2,r0\n"
46      "\tmov\tr0,%1\n"
47      "\tadd\t%3,r0\n"
48      "\tmovco.l\tr0,@%2\n"
49      "\tbf\t0b"
50      : "+m" (*__mem), "=r" (__result)
51      : "r" (__mem), "rI08" (__val)
52      : "r0");
53
54   return __result;
55 }
56
57
58 static inline void
59 __attribute__ ((__unused__))
60 __atomic_add (volatile _Atomic_word* __mem, int __val)
61 {
62   asm("0:\n"
63       "\tmovli.l\t@%1,r0\n"
64       "\tadd\t%2,r0\n"
65       "\tmovco.l\tr0,@%1\n"
66       "\tbf\t0b"
67       : "+m" (*__mem)
68       : "r" (__mem), "rI08" (__val)
69       : "r0");
70 }
71
72 #else
73
74 /* This is generic/atomicity.h */
75
76 #include <bits/gthr.h>
77
78 #define _GLIBCPP_NEED_GENERIC_MUTEX
79
80 typedef int _Atomic_word;
81
82 namespace __gnu_cxx
83 {
84   extern __gthread_mutex_t _Atomic_add_mutex;
85
86 #ifndef __GTHREAD_MUTEX_INIT
87   extern __gthread_once_t _Atomic_add_mutex_once;
88   extern void __gthread_atomic_add_mutex_once();
89 #endif
90 }
91
92 static inline _Atomic_word
93 __attribute__ ((__unused__))
94 __exchange_and_add (volatile _Atomic_word* __mem, int __val)
95 {
96 #ifndef __GTHREAD_MUTEX_INIT
97   __gthread_once (&__gnu_cxx::_Atomic_add_mutex_once,
98                   __gnu_cxx::__gthread_atomic_add_mutex_once);
99 #endif
100
101   _Atomic_word __result;
102
103   __gthread_mutex_lock (&__gnu_cxx::_Atomic_add_mutex);
104
105   __result = *__mem;
106   *__mem += __val;
107
108   __gthread_mutex_unlock (&__gnu_cxx::_Atomic_add_mutex);
109   return __result;
110 }
111
112
113 static inline void
114 __attribute__ ((__unused__))
115 __atomic_add (volatile _Atomic_word* __mem, int __val)
116 {
117   (void) __exchange_and_add (__mem, __val);
118 }
119
120
121 #endif
122
123 #endif /* atomicity.h */