// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

#ifndef VM_ATOMIC_WIN_H_
#define VM_ATOMIC_WIN_H_

#if !defined VM_ATOMIC_H_
#error Do not include atomic_win.h directly. Use atomic.h instead.
#endif

#if !defined(TARGET_OS_WINDOWS)
#error This file should only be included on Windows builds.
#endif

namespace dart {

inline uintptr_t AtomicOperations::FetchAndIncrement(uintptr_t* p) {
#if defined(HOST_ARCH_X64)
  return static_cast<uintptr_t>(
      InterlockedIncrement64(reinterpret_cast<LONGLONG*>(p))) - 1;
#elif defined(HOST_ARCH_IA32)
  return static_cast<uintptr_t>(
      InterlockedIncrement(reinterpret_cast<LONG*>(p))) - 1;
#else
#error Unsupported host architecture.
#endif
}


inline intptr_t AtomicOperations::FetchAndIncrement(intptr_t* p) {
#if defined(HOST_ARCH_X64)
  return static_cast<intptr_t>(
      InterlockedIncrement64(reinterpret_cast<LONGLONG*>(p))) - 1;
#elif defined(HOST_ARCH_IA32)
  return static_cast<intptr_t>(
      InterlockedIncrement(reinterpret_cast<LONG*>(p))) - 1;
#else
#error Unsupported host architecture.
#endif
}


inline void AtomicOperations::IncrementBy(intptr_t* p, intptr_t value) {
#if defined(HOST_ARCH_X64)
  InterlockedExchangeAdd64(reinterpret_cast<LONGLONG*>(p),
                           static_cast<LONGLONG>(value));
#elif defined(HOST_ARCH_IA32)
  InterlockedExchangeAdd(reinterpret_cast<LONG*>(p),
                         static_cast<LONG>(value));
#else
#error Unsupported host architecture.
#endif
}


inline void AtomicOperations::IncrementInt64By(int64_t* p, int64_t value) {
#if defined(HOST_ARCH_IA32) || defined(HOST_ARCH_X64)
  InterlockedExchangeAdd64(reinterpret_cast<LONGLONG*>(p),
                           static_cast<LONGLONG>(value));
#else
#error Unsupported host architecture.
#endif
}


inline uintptr_t AtomicOperations::FetchAndDecrement(uintptr_t* p) {
#if defined(HOST_ARCH_X64)
  return static_cast<uintptr_t>(
      InterlockedDecrement64(reinterpret_cast<LONGLONG*>(p))) + 1;
#elif defined(HOST_ARCH_IA32)
  return static_cast<uintptr_t>(
      InterlockedDecrement(reinterpret_cast<LONG*>(p))) + 1;
#else
#error Unsupported host architecture.
#endif
}


inline intptr_t AtomicOperations::FetchAndDecrement(intptr_t* p) {
#if defined(HOST_ARCH_X64)
  return static_cast<intptr_t>(
      InterlockedDecrement64(reinterpret_cast<LONGLONG*>(p))) + 1;
#elif defined(HOST_ARCH_IA32)
  return static_cast<intptr_t>(
      InterlockedDecrement(reinterpret_cast<LONG*>(p))) + 1;
#else
#error Unsupported host architecture.
#endif
}


inline void AtomicOperations::DecrementBy(intptr_t* p, intptr_t value) {
#if defined(HOST_ARCH_X64)
  InterlockedExchangeAdd64(reinterpret_cast<LONGLONG*>(p),
                           static_cast<LONGLONG>(-value));
#elif defined(HOST_ARCH_IA32)
  InterlockedExchangeAdd(reinterpret_cast<LONG*>(p),
                         static_cast<LONG>(-value));
#else
#error Unsupported host architecture.
#endif
}


#if !defined(USING_SIMULATOR)
inline uword AtomicOperations::CompareAndSwapWord(uword* ptr,
                                                  uword old_value,
                                                  uword new_value) {
#if defined(HOST_ARCH_X64)
  return static_cast<uword>(
      InterlockedCompareExchange64(reinterpret_cast<LONGLONG*>(ptr),
                                   static_cast<LONGLONG>(new_value),
                                   static_cast<LONGLONG>(old_value)));
#elif defined(HOST_ARCH_IA32)
  return static_cast<uword>(
      InterlockedCompareExchange(reinterpret_cast<LONG*>(ptr),
                                 static_cast<LONG>(new_value),
                                 static_cast<LONG>(old_value)));
#else
#error Unsupported host architecture.
#endif
}
inline uint32_t AtomicOperations::CompareAndSwapUint32(uint32_t* ptr,
                                                       uint32_t old_value,
                                                       uint32_t new_value) {
#if (defined(HOST_ARCH_X64) || defined(HOST_ARCH_IA32))
  return static_cast<uint32_t>(
      InterlockedCompareExchange(reinterpret_cast<LONG*>(ptr),
                                 static_cast<LONG>(new_value),
                                 static_cast<LONG>(old_value)));
#else
#error Unsupported host architecture.
#endif
}
#endif  // !defined(USING_SIMULATOR)

}  // namespace dart

#endif  // VM_ATOMIC_WIN_H_
