aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDan Gohman <gohman@apple.com>2008-02-29 01:26:11 +0000
committerDan Gohman <gohman@apple.com>2008-02-29 01:26:11 +0000
commite777063cdf00a194a699e92269d0a56a277ffcc4 (patch)
tree617eb409446e32dac79adc69b0f270346bb14428
parent7e29ba04d0e41ee632ee6e46ab9d10e54d379d62 (diff)
downloadexternal_llvm-e777063cdf00a194a699e92269d0a56a277ffcc4.zip
external_llvm-e777063cdf00a194a699e92269d0a56a277ffcc4.tar.gz
external_llvm-e777063cdf00a194a699e92269d0a56a277ffcc4.tar.bz2
Add a method to APFloat to convert directly from APInt.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@47738 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--include/llvm/ADT/APFloat.h2
-rw-r--r--lib/Support/APFloat.cpp17
2 files changed, 19 insertions, 0 deletions
diff --git a/include/llvm/ADT/APFloat.h b/include/llvm/ADT/APFloat.h
index 65cb1e5..411d8ad 100644
--- a/include/llvm/ADT/APFloat.h
+++ b/include/llvm/ADT/APFloat.h
@@ -208,6 +208,8 @@ namespace llvm {
opStatus convert(const fltSemantics &, roundingMode);
opStatus convertToInteger(integerPart *, unsigned int, bool,
roundingMode) const;
+ opStatus convertFromAPInt(const APInt &,
+ bool, roundingMode);
opStatus convertFromSignExtendedInteger(const integerPart *, unsigned int,
bool, roundingMode);
opStatus convertFromZeroExtendedInteger(const integerPart *, unsigned int,
diff --git a/lib/Support/APFloat.cpp b/lib/Support/APFloat.cpp
index cc86e79..3b448208 100644
--- a/lib/Support/APFloat.cpp
+++ b/lib/Support/APFloat.cpp
@@ -1913,6 +1913,23 @@ APFloat::convertFromUnsignedParts(const integerPart *src,
return normalize(rounding_mode, lost_fraction);
}
+APFloat::opStatus
+APFloat::convertFromAPInt(const APInt &Val,
+ bool isSigned,
+ roundingMode rounding_mode)
+{
+ unsigned int partCount = Val.getNumWords();
+ APInt api = Val;
+
+ sign = false;
+ if (isSigned && api.isNegative()) {
+ sign = true;
+ api = -api;
+ }
+
+ return convertFromUnsignedParts(api.getRawData(), partCount, rounding_mode);
+}
+
/* Convert a two's complement integer SRC to a floating point number,
rounding according to ROUNDING_MODE. ISSIGNED is true if the
integer is signed, in which case it must be sign-extended. */