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 78namespace 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