1e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao//===-- llvm/ADT/APSInt.cpp - Arbitrary Precision Signed Int ---*- C++ -*--===//
2e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao//
3e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao//                     The LLVM Compiler Infrastructure
4e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao//
5e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao// This file is distributed under the University of Illinois Open Source
6e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao// License. See LICENSE.TXT for details.
7e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao//
8e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao//===----------------------------------------------------------------------===//
9e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao//
10e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao// This file implements the APSInt class, which is a simple class that
11e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao// represents an arbitrary sized integer that knows its signedness.
12e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao//
13e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao//===----------------------------------------------------------------------===//
14e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao
15e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao#include "llvm/ADT/APSInt.h"
16e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao#include "llvm/ADT/FoldingSet.h"
17de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/ADT/StringRef.h"
18e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao
19e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liaousing namespace llvm;
20e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao
21f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga NainarAPSInt::APSInt(StringRef Str) {
22f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  assert(!Str.empty() && "Invalid string length");
23f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
24f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  // (Over-)estimate the required number of bits.
25f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  unsigned NumBits = ((Str.size() * 64) / 19) + 2;
26f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  APInt Tmp(NumBits, Str, /*Radix=*/10);
27f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  if (Str[0] == '-') {
28f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    unsigned MinBits = Tmp.getMinSignedBits();
29f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    if (MinBits > 0 && MinBits < NumBits)
30f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      Tmp = Tmp.trunc(MinBits);
31f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    *this = APSInt(Tmp, /*IsUnsigned=*/false);
32f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    return;
33f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  }
34f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  unsigned ActiveBits = Tmp.getActiveBits();
35f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  if (ActiveBits > 0 && ActiveBits < NumBits)
36f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    Tmp = Tmp.trunc(ActiveBits);
37f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  *this = APSInt(Tmp, /*IsUnsigned=*/true);
38f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar}
39f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
40e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liaovoid APSInt::Profile(FoldingSetNodeID& ID) const {
41e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  ID.AddInteger((unsigned) (IsUnsigned ? 1 : 0));
42e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao  APInt::Profile(ID);
43e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao}
44