// Copyright (c) 2012, 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_PLATFORM_UTILS_WIN_H_
#define RUNTIME_PLATFORM_UTILS_WIN_H_

#if !defined(RUNTIME_PLATFORM_UTILS_H_)
#error Do not include utils_win.h directly; use utils.h instead.
#endif

#include <intrin.h>
#include <stdlib.h>

namespace dart {

inline int Utils::CountLeadingZeros(uword x) {
  unsigned long position;  // NOLINT
#if defined(ARCH_IS_32_BIT)
  _BitScanReverse(&position, x);
#elif defined(ARCH_IS_64_BIT)
  _BitScanReverse64(&position, x);
#else
#error Architecture is not 32-bit or 64-bit.
#endif
  return kBitsPerWord - static_cast<int>(position) - 1;
}

inline int Utils::CountTrailingZeros(uword x) {
  unsigned long result;  // NOLINT
#if defined(ARCH_IS_32_BIT)
  _BitScanForward(&result, x);
#elif defined(ARCH_IS_64_BIT)
  _BitScanForward64(&result, x);
#else
#error Architecture is not 32-bit or 64-bit.
#endif
  return static_cast<int>(result);
}

// WARNING: The below functions assume host is always Little Endian!

inline uint16_t Utils::HostToBigEndian16(uint16_t value) {
  return _byteswap_ushort(value);
}

inline uint32_t Utils::HostToBigEndian32(uint32_t value) {
  return _byteswap_ulong(value);
}

inline uint64_t Utils::HostToBigEndian64(uint64_t value) {
  return _byteswap_uint64(value);
}

inline uint16_t Utils::HostToLittleEndian16(uint16_t value) {
  return value;
}

inline uint32_t Utils::HostToLittleEndian32(uint32_t value) {
  return value;
}

inline uint64_t Utils::HostToLittleEndian64(uint64_t value) {
  return value;
}

}  // namespace dart

#endif  // RUNTIME_PLATFORM_UTILS_WIN_H_
