OpenCores
URL https://opencores.org/ocsvn/openrisc_me/openrisc_me/trunk

Subversion Repositories openrisc_me

[/] [openrisc/] [trunk/] [gnu-src/] [gcc-4.5.1/] [libstdc++-v3/] [config/] [cpu/] [cris/] [atomicity.h] - Blame information for rev 424

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 424 jeremybenn
// Low-level functions for atomic operations: CRIS version  -*- C++ -*-
2
 
3
// Copyright (C) 2001, 2003, 2004, 2005, 2009 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 3, 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
// Under Section 7 of GPL version 3, you are granted additional
17
// permissions described in the GCC Runtime Library Exception, version
18
// 3.1, as published by the Free Software Foundation.
19
 
20
// You should have received a copy of the GNU General Public License and
21
// a copy of the GCC Runtime Library Exception along with this program;
22
// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
23
// <http://www.gnu.org/licenses/>.
24
 
25
#include <ext/atomicity.h>
26
 
27
_GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
28
 
29
  _Atomic_word
30
  __exchange_and_add(volatile _Atomic_word* __mem, int __val) throw ()
31
  {
32
    int __tmp;
33
    _Atomic_word __result;
34
 
35
#if (__CRIS_arch_version >= 32)
36
  __asm__ __volatile__ (" clearf p             \n"
37
                       "0:                     \n"
38
                       " move.d %4,%2          \n"
39
                       " move.d [%3],%0        \n"
40
                       " add.d %0,%2           \n"
41
                       " ax                    \n"
42
                       " move.d %2,[%3]        \n"
43
                       " bcs 0b                \n"
44
                       " clearf p              \n"
45
                       :  "=&r" (__result), "=Q" (*__mem), "=&r" (__tmp)
46
                       : "r" (__mem), "g" (__val), "Q" (*__mem)
47
                       : "memory");
48
#elif (__CRIS_arch_version >= 10)
49
    __asm__ __volatile__ (" clearf              \n"
50
                        "0:                     \n"
51
                        " move.d %4,%2          \n"
52
                        " move.d [%3],%0        \n"
53
                        " add.d %0,%2           \n"
54
                        " ax                    \n"
55
                        " move.d %2,[%3]        \n"
56
                        " bwf 0b                \n"
57
                        " clearf                \n"
58
                        :  "=&r" (__result), "=Q" (*__mem), "=&r" (__tmp)
59
                        : "r" (__mem), "g" (__val), "Q" (*__mem)
60
                        /* The memory clobber must stay, regardless of
61
                           current uses of this function.  */
62
                        : "memory");
63
#else
64
    __asm__ __volatile__ (" move $ccr,$r9       \n"
65
                        " di                    \n"
66
                        " move.d %4,%2          \n"
67
                        " move.d [%3],%0        \n"
68
                        " add.d %0,%2           \n"
69
                        " move.d %2,[%3]        \n"
70
                        " move $r9,$ccr         \n"
71
                        :  "=&r" (__result), "=Q" (*__mem), "=&r" (__tmp)
72
                        : "r" (__mem), "g" (__val), "Q" (*__mem)
73
                        : "r9",
74
                          /* The memory clobber must stay, regardless of
75
                             current uses of this function.  */
76
                          "memory");
77
#endif
78
 
79
    return __result;
80
  }
81
 
82
  void
83
  __atomic_add(volatile _Atomic_word* __mem, int __val) throw ()
84
  { __exchange_and_add(__mem, __val); }
85
 
86
_GLIBCXX_END_NAMESPACE

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.