1 // Low-level functions for atomic operations: sh version -*- C++ -*- 2 3 // Copyright (C) 1999, 2001, 2002, 2003, 2004, 2005, 2006, 2009 4 // Free Software Foundation, Inc. 5 // 6 // This file is part of the GNU ISO C++ Library. This library is free 7 // software; you can redistribute it and/or modify it under the 8 // terms of the GNU General Public License as published by the 9 // Free Software Foundation; either version 3, or (at your option) 10 // any later version. 11 12 // This library is distributed in the hope that it will be useful, 13 // but WITHOUT ANY WARRANTY; without even the implied warranty of 14 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 // GNU General Public License for more details. 16 17 // Under Section 7 of GPL version 3, you are granted additional 18 // permissions described in the GCC Runtime Library Exception, version 19 // 3.1, as published by the Free Software Foundation. 20 21 // You should have received a copy of the GNU General Public License and 22 // a copy of the GCC Runtime Library Exception along with this program; 23 // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see 24 // <http://www.gnu.org/licenses/>. 25 26 #ifdef __SH4A__ 27 28 #include <ext/atomicity.h> 29 30 _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx) 31 32 typedef int _Atomic_word; 33 34 _Atomic_word 35 __attribute__ ((__unused__)) 36 __exchange_and_add (volatile _Atomic_word* __mem, int __val) throw () 37 { 38 _Atomic_word __result; 39 40 __asm__ __volatile__ 41 ("0:\n" 42 "\tmovli.l\t@%2,r0\n" 43 "\tmov\tr0,%1\n" 44 "\tadd\t%3,r0\n" 45 "\tmovco.l\tr0,@%2\n" 46 "\tbf\t0b" 47 : "+m" (*__mem), "=&r" (__result) 48 : "r" (__mem), "rI08" (__val) 49 : "r0"); 50 51 return __result; 52 } 53 54 55 void 56 __attribute__ ((__unused__)) 57 __atomic_add (volatile _Atomic_word* __mem, int __val) throw () 58 { 59 asm("0:\n" 60 "\tmovli.l\t@%1,r0\n" 61 "\tadd\t%2,r0\n" 62 "\tmovco.l\tr0,@%1\n" 63 "\tbf\t0b" 64 : "+m" (*__mem) 65 : "r" (__mem), "rI08" (__val) 66 : "r0"); 67 } 68 69 _GLIBCXX_END_NAMESPACE 70 71 #else /* !__SH4A__ */ 72 73 /* This is generic/atomicity.h */ 74 75 #include <ext/atomicity.h> 76 #include <ext/concurrence.h> 77 78 namespace 79 { 80 __gnu_cxx::__mutex atomic_mutex; 81 } // anonymous namespace 82 83 _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx) 84 85 _Atomic_word 86 __attribute__ ((__unused__)) 87 __exchange_and_add(volatile _Atomic_word* __mem, int __val) throw () 88 { 89 __gnu_cxx::__scoped_lock sentry(atomic_mutex); 90 _Atomic_word __result; 91 __result = *__mem; 92 *__mem += __val; 93 return __result; 94 } 95 96 void 97 __attribute__ ((__unused__)) 98 __atomic_add(volatile _Atomic_word* __mem, int __val) throw () 99 { __exchange_and_add(__mem, __val); } 100 101 _GLIBCXX_END_NAMESPACE 102 103 #endif /* !__SH4A__ */ 104