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