//===-- subzero/src/IceAPInt.h - Constant integer conversions --*- C++ -*--===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
///
/// \file
/// \brief This file implements a class to represent 64 bit integer constant
/// values, and their conversion to variable bit sized integers.
///
/// Note: This is a simplified version of llvm/include/llvm/ADT/APInt.h for use
/// with Subzero.
//===----------------------------------------------------------------------===//

#ifndef SUBZERO_SRC_ICEAPINT_H
#define SUBZERO_SRC_ICEAPINT_H

#include "IceDefs.h"

namespace Ice {

class APInt {
  APInt() = delete;
  APInt(const APInt &) = delete;
  APInt &operator=(const APInt &) = delete;

public:
  /// Bits in an (internal) value.
  static const SizeT APINT_BITS_PER_WORD = sizeof(uint64_t) * CHAR_BIT;

  APInt(SizeT Bits, uint64_t Val) : BitWidth(Bits), Val(Val) {
    assert(Bits && "bitwidth too small");
    assert(Bits <= APINT_BITS_PER_WORD && "bitwidth too big");
    clearUnusedBits();
  }

  uint32_t getBitWidth() const { return BitWidth; }

  int64_t getSExtValue() const {
    return static_cast<int64_t>(Val << (APINT_BITS_PER_WORD - BitWidth)) >>
           (APINT_BITS_PER_WORD - BitWidth);
  }

  uint64_t getRawData() const { return Val; }

private:
  uint32_t BitWidth; /// The number of bits in this APInt.
  uint64_t Val;      /// The (64-bit) equivalent integer value.

  /// Clear unused high order bits.
  void clearUnusedBits() {
    // If all bits are used, we want to leave the value alone.
    if (BitWidth == APINT_BITS_PER_WORD)
      return;

    // Mask out the high bits.
    Val &= ~static_cast<uint64_t>(0) >> (APINT_BITS_PER_WORD - BitWidth);
  }
};

} // end of namespace Ice

#endif // SUBZERO_SRC_ICEAPINT_H
