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.

84 lines
2.5KB

  1. // Low-level functions for atomic operations.
  2. // Copyright (C) 2001, 2002, 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. typedef int _Atomic_word;
  28. static inline int
  29. __attribute__ ((__unused__))
  30. __exchange_and_add(volatile _Atomic_word* __mem, int __val)
  31. {
  32. int __result, __tmp;
  33. __asm__ __volatile__
  34. ("/* Inline exchange & add */\n\t"
  35. "1:\n\t"
  36. ".set push\n\t"
  37. #if _MIPS_SIM == _ABIO32
  38. ".set mips2\n\t"
  39. #endif
  40. "ll %0,%3\n\t"
  41. "addu %1,%4,%0\n\t"
  42. "sc %1,%2\n\t"
  43. ".set pop\n\t"
  44. "beqz %1,1b\n\t"
  45. "/* End exchange & add */"
  46. : "=&r"(__result), "=&r"(__tmp), "=m"(*__mem)
  47. : "m" (*__mem), "r"(__val));
  48. return __result;
  49. }
  50. static inline void
  51. __attribute__ ((__unused__))
  52. __atomic_add(volatile _Atomic_word* __mem, int __val)
  53. {
  54. int __result;
  55. __asm__ __volatile__
  56. ("/* Inline atomic add */\n\t"
  57. "1:\n\t"
  58. ".set push\n\t"
  59. #if _MIPS_SIM == _ABIO32
  60. ".set mips2\n\t"
  61. #endif
  62. "ll %0,%2\n\t"
  63. "addu %0,%3,%0\n\t"
  64. "sc %0,%1\n\t"
  65. ".set pop\n\t"
  66. "beqz %0,1b\n\t"
  67. "/* End atomic add */"
  68. : "=&r"(__result), "=m"(*__mem)
  69. : "m" (*__mem), "r"(__val));
  70. }
  71. #endif /* atomicity.h */