jack2 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.

77 lines
1.8KB

  1. /*
  2. Copyright (C) 2004-2008 Grame
  3. This program is free software; you can redistribute it and/or modify
  4. it under the terms of the GNU Lesser General Public License as published by
  5. the Free Software Foundation; either version 2.1 of the License, or
  6. (at your option) any later version.
  7. This program is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  10. GNU Lesser General Public License for more details.
  11. You should have received a copy of the GNU Lesser General Public License
  12. along with this program; if not, write to the Free Software
  13. Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  14. */
  15. #ifndef __JackAtomic_WIN32__
  16. #define __JackAtomic_WIN32__
  17. #include "JackTypes.h"
  18. #ifndef __MINGW32__
  19. #ifdef __SMP__
  20. # define LOCK lock
  21. #else
  22. # define LOCK
  23. #endif
  24. #ifndef inline
  25. #define inline __inline
  26. #endif
  27. //----------------------------------------------------------------
  28. // CAS functions
  29. //----------------------------------------------------------------
  30. inline char CAS(volatile UInt32 value, UInt32 newvalue, volatile void * addr)
  31. {
  32. register char c;
  33. __asm {
  34. push ebx
  35. push esi
  36. mov esi, addr
  37. mov eax, value
  38. mov ebx, newvalue
  39. LOCK cmpxchg dword ptr [esi], ebx
  40. sete c
  41. pop esi
  42. pop ebx
  43. }
  44. return c;
  45. }
  46. #else
  47. #define LOCK "lock ; "
  48. static inline char CAS(volatile UInt32 value, UInt32 newvalue, volatile void* addr)
  49. {
  50. register char ret;
  51. __asm__ __volatile__ (
  52. "# CAS \n\t"
  53. LOCK "cmpxchg %2, (%1) \n\t"
  54. "sete %0 \n\t"
  55. : "=a" (ret)
  56. : "c" (addr), "d" (newvalue), "a" (value)
  57. );
  58. return ret;
  59. }
  60. #endif
  61. #endif