APSInt.cpp revision f3ef5332fa3f4d5ec72c178a2b19dac363a19383
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" 17e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao 18e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liaousing namespace llvm; 19e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao 20f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga NainarAPSInt::APSInt(StringRef Str) { 21f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar assert(!Str.empty() && "Invalid string length"); 22f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar 23f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar // (Over-)estimate the required number of bits. 24f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar unsigned NumBits = ((Str.size() * 64) / 19) + 2; 25f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar APInt Tmp(NumBits, Str, /*Radix=*/10); 26f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar if (Str[0] == '-') { 27f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar unsigned MinBits = Tmp.getMinSignedBits(); 28f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar if (MinBits > 0 && MinBits < NumBits) 29f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar Tmp = Tmp.trunc(MinBits); 30f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar *this = APSInt(Tmp, /*IsUnsigned=*/false); 31f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar return; 32f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar } 33f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar unsigned ActiveBits = Tmp.getActiveBits(); 34f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar if (ActiveBits > 0 && ActiveBits < NumBits) 35f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar Tmp = Tmp.trunc(ActiveBits); 36f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar *this = APSInt(Tmp, /*IsUnsigned=*/true); 37f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar} 38f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar 39e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liaovoid APSInt::Profile(FoldingSetNodeID& ID) const { 40e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao ID.AddInteger((unsigned) (IsUnsigned ? 1 : 0)); 41e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao APInt::Profile(ID); 42e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao} 43