// 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 RUNTIME_VM_ATOMIC_WIN_H_
#define RUNTIME_VM_ATOMIC_WIN_H_

#if !defined RUNTIME_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  // RUNTIME_VM_ATOMIC_WIN_H_
