mirror of
https://github.com/RPCSX/llvm.git
synced 2024-11-28 14:10:41 +00:00
1c5cf241af
This commit moves the APSInt initialization code that's used by the LLLexer class into a new APSInt constructor that constructs APSInts from strings. This change is useful for MIR Serialization, as it would allow the MILexer class to use the same APSInt initialization as LLexer when parsing immediate machine operands. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@240436 91177308-0d34-0410-b5e6-96231b3b80d8
43 lines
1.4 KiB
C++
43 lines
1.4 KiB
C++
//===-- llvm/ADT/APSInt.cpp - Arbitrary Precision Signed Int ---*- C++ -*--===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This file implements the APSInt class, which is a simple class that
|
|
// represents an arbitrary sized integer that knows its signedness.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "llvm/ADT/APSInt.h"
|
|
#include "llvm/ADT/FoldingSet.h"
|
|
|
|
using namespace llvm;
|
|
|
|
APSInt::APSInt(StringRef Str) {
|
|
assert(!Str.empty() && "Invalid string length");
|
|
|
|
// (Over-)estimate the required number of bits.
|
|
unsigned NumBits = ((Str.size() * 64) / 19) + 2;
|
|
APInt Tmp(NumBits, Str, /*Radix=*/10);
|
|
if (Str[0] == '-') {
|
|
unsigned MinBits = Tmp.getMinSignedBits();
|
|
if (MinBits > 0 && MinBits < NumBits)
|
|
Tmp = Tmp.trunc(MinBits);
|
|
*this = APSInt(Tmp, /*IsUnsigned=*/false);
|
|
return;
|
|
}
|
|
unsigned ActiveBits = Tmp.getActiveBits();
|
|
if (ActiveBits > 0 && ActiveBits < NumBits)
|
|
Tmp = Tmp.trunc(ActiveBits);
|
|
*this = APSInt(Tmp, /*IsUnsigned=*/true);
|
|
}
|
|
|
|
void APSInt::Profile(FoldingSetNodeID& ID) const {
|
|
ID.AddInteger((unsigned) (IsUnsigned ? 1 : 0));
|
|
APInt::Profile(ID);
|
|
}
|