jack1 codebase
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

79 lines
2.5KB

  1. // Low-level functions for atomic operations: CRIS version -*- C++ -*-
  2. // Copyright (C) 2001, 2003 Free Software Foundation, Inc.
  3. //
  4. // This file is part of the GNU ISO C++ Library. This library is free
  5. // software; you can redistribute it and/or modify it under the
  6. // terms of the GNU General Public License as published by the
  7. // Free Software Foundation; either version 2, or (at your option)
  8. // any later version.
  9. // This library is distributed in the hope that it will be useful,
  10. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. // GNU General Public License for more details.
  13. // You should have received a copy of the GNU General Public License along
  14. // with this library; see the file COPYING. If not, write to the Free
  15. // Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
  16. // USA.
  17. // As a special exception, you may use this file as part of a free software
  18. // library without restriction. Specifically, if other files instantiate
  19. // templates or use macros or inline functions from this file, or you compile
  20. // this file and link it with other files to produce an executable, this
  21. // file does not by itself cause the resulting executable to be covered by
  22. // the GNU General Public License. This exception does not however
  23. // invalidate any other reasons why the executable file might be covered by
  24. // the GNU General Public License.
  25. #ifndef _GLIBCXX_ATOMICITY_H
  26. #define _GLIBCXX_ATOMICITY_H 1
  27. // This entity must not cross a page boundary.
  28. typedef int _Atomic_word __attribute__ ((__aligned__ (4)));
  29. static inline _Atomic_word
  30. __attribute__ ((__unused__))
  31. __exchange_and_add(_Atomic_word* __mem, int __val)
  32. {
  33. int __tmp;
  34. _Atomic_word __result;
  35. #if (__CRIS_arch_version >= 10)
  36. __asm__ __volatile__ (" clearf \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. " bwf 0b \n"
  44. " clearf \n"
  45. : "=&r" (__result), "=m" (*__mem), "=&r" (__tmp)
  46. : "r" (__mem), "g" (__val), "m" (*__mem));
  47. #else
  48. __asm__ __volatile__ (" move $ccr,$r9 \n"
  49. " di \n"
  50. " move.d %4,%2 \n"
  51. " move.d [%3],%0 \n"
  52. " add.d %0,%2 \n"
  53. " move.d %2,[%3] \n"
  54. " move $r9,$ccr \n"
  55. : "=&r" (__result), "=m" (*__mem), "=&r" (__tmp)
  56. : "r" (__mem), "g" (__val), "m" (*__mem)
  57. : "r9");
  58. #endif
  59. return __result;
  60. }
  61. static inline void
  62. __attribute__ ((__unused__))
  63. __atomic_add(_Atomic_word* __mem, int __val)
  64. {
  65. __exchange_and_add(__mem, __val);
  66. }
  67. #endif /* atomicity.h */