// 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_

#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);
}

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_
