APFloat.h revision 7ed47a13356daed2a34cd2209a31f92552e3bdd8
1b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner//== llvm/Support/APFloat.h - Arbitrary Precision Floating Point -*- C++ -*-==// 2b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner// 3b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner// The LLVM Compiler Infrastructure 4b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner// 57ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner// This file is distributed under the University of Illinois Open Source 67ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner// License. See LICENSE.TXT for details. 7b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner// 8b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner//===----------------------------------------------------------------------===// 9b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner// 10b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner// This file declares a class to represent arbitrary precision floating 11b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner// point values and provide a variety of arithmetic operations on them. 12b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner// 13b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner//===----------------------------------------------------------------------===// 14b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner 15b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner/* A self-contained host- and target-independent arbitrary-precision 16a30b0ee959b53e83ed3697ee0b704a493829dc04Neil Booth floating-point software implementation. It uses bignum integer 17a30b0ee959b53e83ed3697ee0b704a493829dc04Neil Booth arithmetic as provided by static functions in the APInt class. 18b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner The library will work with bignum integers whose parts are any 19a30b0ee959b53e83ed3697ee0b704a493829dc04Neil Booth unsigned type at least 16 bits wide, but 64 bits is recommended. 20b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner 21b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner Written for clarity rather than speed, in particular with a view 22b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner to use in the front-end of a cross compiler so that target 23b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner arithmetic can be correctly performed on the host. Performance 24b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner should nonetheless be reasonable, particularly for its intended 25b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner use. It may be useful as a base implementation for a run-time 26b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner library during development of a faster target-specific one. 27b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner 28b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner All 5 rounding modes in the IEEE-754R draft are handled correctly 29b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner for all implemented operations. Currently implemented operations 30b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner are add, subtract, multiply, divide, fused-multiply-add, 31b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner conversion-to-float, conversion-to-integer and 32b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner conversion-from-integer. New rounding modes (e.g. away from zero) 33a30b0ee959b53e83ed3697ee0b704a493829dc04Neil Booth can be added with three or four lines of code. 34b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner 35b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner Four formats are built-in: IEEE single precision, double 36b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner precision, quadruple precision, and x87 80-bit extended double 37b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner (when operating with full extended precision). Adding a new 38b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner format that obeys IEEE semantics only requires adding two lines of 39b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner code: a declaration and definition of the format. 40b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner 41b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner All operations return the status of that operation as an exception 42b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner bit-mask, so multiple operations can be done consecutively with 43b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner their results or-ed together. The returned status can be useful 44b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner for compiler diagnostics; e.g., inexact, underflow and overflow 45b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner can be easily diagnosed on constant folding, and compiler 46b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner optimizers can determine what exceptions would be raised by 47b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner folding operations and optimize, or perhaps not optimize, 48b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner accordingly. 49b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner 50b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner At present, underflow tininess is detected after rounding; it 51b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner should be straight forward to add support for the before-rounding 52b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner case too. 53b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner 54a30b0ee959b53e83ed3697ee0b704a493829dc04Neil Booth The library reads hexadecimal floating point numbers as per C99, 55a30b0ee959b53e83ed3697ee0b704a493829dc04Neil Booth and correctly rounds if necessary according to the specified 56a30b0ee959b53e83ed3697ee0b704a493829dc04Neil Booth rounding mode. Syntax is required to have been validated by the 57a30b0ee959b53e83ed3697ee0b704a493829dc04Neil Booth caller. It also converts floating point numbers to hexadecimal 58a30b0ee959b53e83ed3697ee0b704a493829dc04Neil Booth text as per the C99 %a and %A conversions. The output precision 59a30b0ee959b53e83ed3697ee0b704a493829dc04Neil Booth (or alternatively the natural minimal precision) can be specified; 60a30b0ee959b53e83ed3697ee0b704a493829dc04Neil Booth if the requested precision is less than the natural precision the 61a30b0ee959b53e83ed3697ee0b704a493829dc04Neil Booth output is correctly rounded for the specified rounding mode. 62a30b0ee959b53e83ed3697ee0b704a493829dc04Neil Booth 6396c7471b39dc77d4f29658212e5a72e575b23c39Neil Booth It also reads decimal floating point numbers and correctly rounds 6496c7471b39dc77d4f29658212e5a72e575b23c39Neil Booth according to the specified rounding mode. 6596c7471b39dc77d4f29658212e5a72e575b23c39Neil Booth 6696c7471b39dc77d4f29658212e5a72e575b23c39Neil Booth Conversion to decimal text is not currently implemented. 67a30b0ee959b53e83ed3697ee0b704a493829dc04Neil Booth 68b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner Non-zero finite numbers are represented internally as a sign bit, 69b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner a 16-bit signed exponent, and the significand as an array of 70b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner integer parts. After normalization of a number of precision P the 71b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner exponent is within the range of the format, and if the number is 72b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner not denormal the P-th bit of the significand is set as an explicit 73b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner integer bit. For denormals the most significant bit is shifted 74b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner right so that the exponent is maintained at the format's minimum, 75b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner so that the smallest denormal has just the least significant bit 76b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner of the significand set. The sign of zeroes and infinities is 77117acf9e36a0789d56b52525e031f575f80fe169Neil Booth significant; the exponent and significand of such numbers is not 78117acf9e36a0789d56b52525e031f575f80fe169Neil Booth stored, but has a known implicit (deterministic) value: 0 for the 79117acf9e36a0789d56b52525e031f575f80fe169Neil Booth significands, 0 for zero exponent, all 1 bits for infinity 80117acf9e36a0789d56b52525e031f575f80fe169Neil Booth exponent. For NaNs the sign and significand are deterministic, 81117acf9e36a0789d56b52525e031f575f80fe169Neil Booth although not really meaningful, and preserved in non-conversion 82117acf9e36a0789d56b52525e031f575f80fe169Neil Booth operations. The exponent is implicitly all 1 bits. 83b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner 84b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner TODO 85b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner ==== 86b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner 87b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner Some features that may or may not be worth adding: 88b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner 8996c7471b39dc77d4f29658212e5a72e575b23c39Neil Booth Binary to decimal conversion (hard). 90b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner 91b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner Optional ability to detect underflow tininess before rounding. 92b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner 93b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner New formats: x87 in single and double precision mode (IEEE apart 9496c7471b39dc77d4f29658212e5a72e575b23c39Neil Booth from extended exponent range) (hard). 95b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner 96a30b0ee959b53e83ed3697ee0b704a493829dc04Neil Booth New operations: sqrt, IEEE remainder, C90 fmod, nextafter, 97a30b0ee959b53e83ed3697ee0b704a493829dc04Neil Booth nexttoward. 98b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner*/ 99b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner 100b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner#ifndef LLVM_FLOAT_H 101b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner#define LLVM_FLOAT_H 102b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner 103b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner// APInt contains static functions implementing bignum arithmetic. 104b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner#include "llvm/ADT/APInt.h" 105b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner 106b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattnernamespace llvm { 107b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner 108b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner /* Exponents are stored as signed numbers. */ 109b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner typedef signed short exponent_t; 110b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner 111b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner struct fltSemantics; 112b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner 113b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner /* When bits of a floating point number are truncated, this enum is 114b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner used to indicate what fraction of the LSB those bits represented. 115b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner It essentially combines the roles of guard and sticky bits. */ 116b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner enum lostFraction { // Example of truncated bits: 117b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner lfExactlyZero, // 000000 118b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner lfLessThanHalf, // 0xxxxx x's not all zero 119b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner lfExactlyHalf, // 100000 120b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner lfMoreThanHalf // 1xxxxx x's not all zero 121b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner }; 122b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner 123b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner class APFloat { 124b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner public: 125b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner 126b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner /* We support the following floating point semantics. */ 127b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner static const fltSemantics IEEEsingle; 128b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner static const fltSemantics IEEEdouble; 129b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner static const fltSemantics IEEEquad; 130a471c2ecda37cd1bae0d94e832f002caa7b63216Dale Johannesen static const fltSemantics PPCDoubleDouble; 131b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner static const fltSemantics x87DoubleExtended; 132343e770983dcf53a1ea2dfca4e04d28ebc41138aDale Johannesen /* And this psuedo, used to construct APFloats that cannot 133343e770983dcf53a1ea2dfca4e04d28ebc41138aDale Johannesen conflict with anything real. */ 134343e770983dcf53a1ea2dfca4e04d28ebc41138aDale Johannesen static const fltSemantics Bogus; 135b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner 136b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner static unsigned int semanticsPrecision(const fltSemantics &); 137b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner 138b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner /* Floating point numbers have a four-state comparison relation. */ 139b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner enum cmpResult { 140b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner cmpLessThan, 141b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner cmpEqual, 142b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner cmpGreaterThan, 143b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner cmpUnordered 144b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner }; 145b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner 146b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner /* IEEE-754R gives five rounding modes. */ 147b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner enum roundingMode { 148b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner rmNearestTiesToEven, 149b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner rmTowardPositive, 150b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner rmTowardNegative, 151b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner rmTowardZero, 152b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner rmNearestTiesToAway 153b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner }; 154b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner 155b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner /* Operation status. opUnderflow or opOverflow are always returned 156b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner or-ed with opInexact. */ 157b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner enum opStatus { 158b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner opOK = 0x00, 159b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner opInvalidOp = 0x01, 160b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner opDivByZero = 0x02, 161b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner opOverflow = 0x04, 162b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner opUnderflow = 0x08, 163b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner opInexact = 0x10 164b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner }; 165b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner 166b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner /* Category of internally-represented number. */ 167b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner enum fltCategory { 168b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner fcInfinity, 169eaf089430e7681fcddc3465c3b33b9645273ab02Dale Johannesen fcNaN, 170b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner fcNormal, 171b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner fcZero 172b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner }; 173b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner 174b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner /* Constructors. */ 175b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner APFloat(const fltSemantics &, const char *); 176b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner APFloat(const fltSemantics &, integerPart); 177b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner APFloat(const fltSemantics &, fltCategory, bool negative); 1788a901985bc599df9dfd2fca0b8dd0da4585df8a7Chris Lattner explicit APFloat(double d); 1798a901985bc599df9dfd2fca0b8dd0da4585df8a7Chris Lattner explicit APFloat(float f); 180a471c2ecda37cd1bae0d94e832f002caa7b63216Dale Johannesen explicit APFloat(const APInt &, bool isIEEE = false); 181b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner APFloat(const APFloat &); 182b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner ~APFloat(); 183c47dfdde2458f97d2ef8342b73b526579424c381Ted Kremenek 184c47dfdde2458f97d2ef8342b73b526579424c381Ted Kremenek /// @brief Used by the Bitcode serializer to emit APInts to Bitcode. 185c47dfdde2458f97d2ef8342b73b526579424c381Ted Kremenek void Emit(Serializer& S) const; 186c47dfdde2458f97d2ef8342b73b526579424c381Ted Kremenek 187c47dfdde2458f97d2ef8342b73b526579424c381Ted Kremenek /// @brief Used by the Bitcode deserializer to deserialize APInts. 188c47dfdde2458f97d2ef8342b73b526579424c381Ted Kremenek static APFloat ReadVal(Deserializer& D); 189b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner 190b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner /* Arithmetic. */ 191b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner opStatus add(const APFloat &, roundingMode); 192b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner opStatus subtract(const APFloat &, roundingMode); 193b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner opStatus multiply(const APFloat &, roundingMode); 194b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner opStatus divide(const APFloat &, roundingMode); 195c4dd3c3b519aa2c2ed26ce03a4b1fbb992efeacaDale Johannesen opStatus mod(const APFloat &, roundingMode); 196b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner opStatus fusedMultiplyAdd(const APFloat &, const APFloat &, roundingMode); 19796c7471b39dc77d4f29658212e5a72e575b23c39Neil Booth 19896c7471b39dc77d4f29658212e5a72e575b23c39Neil Booth /* Sign operations. */ 19996c7471b39dc77d4f29658212e5a72e575b23c39Neil Booth void changeSign(); 20096c7471b39dc77d4f29658212e5a72e575b23c39Neil Booth void clearSign(); 20196c7471b39dc77d4f29658212e5a72e575b23c39Neil Booth void copySign(const APFloat &); 202b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner 203b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner /* Conversions. */ 204b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner opStatus convert(const fltSemantics &, roundingMode); 205b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner opStatus convertToInteger(integerPart *, unsigned int, bool, 206b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner roundingMode) const; 207f16c595252de363e0e1f6895a5a626bc30017053Neil Booth opStatus convertFromSignExtendedInteger(const integerPart *, unsigned int, 208f16c595252de363e0e1f6895a5a626bc30017053Neil Booth bool, roundingMode); 209ccf596a53e16ea221a9bf8b3874a7d6afa71f1f4Neil Booth opStatus convertFromZeroExtendedInteger(const integerPart *, unsigned int, 210ccf596a53e16ea221a9bf8b3874a7d6afa71f1f4Neil Booth bool, roundingMode); 211b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner opStatus convertFromString(const char *, roundingMode); 2123f6eb7419de437436265831fce92f62498556e08Dale Johannesen APInt convertToAPInt() const; 213343e770983dcf53a1ea2dfca4e04d28ebc41138aDale Johannesen double convertToDouble() const; 214343e770983dcf53a1ea2dfca4e04d28ebc41138aDale Johannesen float convertToFloat() const; 215b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner 21612595d7b165bf460b18f4ddd395dd29e6e6e68bcDale Johannesen /* The definition of equality is not straightforward for floating point, 21712595d7b165bf460b18f4ddd395dd29e6e6e68bcDale Johannesen so we won't use operator==. Use one of the following, or write 21812595d7b165bf460b18f4ddd395dd29e6e6e68bcDale Johannesen whatever it is you really mean. */ 21921dcae17f580678c452eac73e01424c924d2f994Dale Johannesen // bool operator==(const APFloat &) const; // DO NOT IMPLEMENT 220117acf9e36a0789d56b52525e031f575f80fe169Neil Booth 221eaf089430e7681fcddc3465c3b33b9645273ab02Dale Johannesen /* IEEE comparison with another floating point number (NaNs 222343e770983dcf53a1ea2dfca4e04d28ebc41138aDale Johannesen compare unordered, 0==-0). */ 223b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner cmpResult compare(const APFloat &) const; 224b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner 225a30b0ee959b53e83ed3697ee0b704a493829dc04Neil Booth /* Write out a hexadecimal representation of the floating point 226a30b0ee959b53e83ed3697ee0b704a493829dc04Neil Booth value to DST, which must be of sufficient size, in the C99 form 227a30b0ee959b53e83ed3697ee0b704a493829dc04Neil Booth [-]0xh.hhhhp[+-]d. Return the number of characters written, 228a30b0ee959b53e83ed3697ee0b704a493829dc04Neil Booth excluding the terminating NUL. */ 229a30b0ee959b53e83ed3697ee0b704a493829dc04Neil Booth unsigned int convertToHexString(char *dst, unsigned int hexDigits, 230a30b0ee959b53e83ed3697ee0b704a493829dc04Neil Booth bool upperCase, roundingMode) const; 231a30b0ee959b53e83ed3697ee0b704a493829dc04Neil Booth 232343e770983dcf53a1ea2dfca4e04d28ebc41138aDale Johannesen /* Bitwise comparison for equality (QNaNs compare equal, 0!=-0). */ 23312595d7b165bf460b18f4ddd395dd29e6e6e68bcDale Johannesen bool bitwiseIsEqual(const APFloat &) const; 234d3b51fd17024569cc53ae02b9a4f80857930e08bDale Johannesen 235b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner /* Simple queries. */ 236b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner fltCategory getCategory() const { return category; } 237b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner const fltSemantics &getSemantics() const { return *semantics; } 238b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner bool isZero() const { return category == fcZero; } 239b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner bool isNonZero() const { return category != fcZero; } 24010c42185d82c121e8f7d261decde798c05567c59Chris Lattner bool isNaN() const { return category == fcNaN; } 241b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner bool isNegative() const { return sign; } 242eaf089430e7681fcddc3465c3b33b9645273ab02Dale Johannesen bool isPosZero() const { return isZero() && !isNegative(); } 243eaf089430e7681fcddc3465c3b33b9645273ab02Dale Johannesen bool isNegZero() const { return isZero() && isNegative(); } 244b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner 245b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner APFloat& operator=(const APFloat &); 246b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner 247343e770983dcf53a1ea2dfca4e04d28ebc41138aDale Johannesen /* Return an arbitrary integer value usable for hashing. */ 248343e770983dcf53a1ea2dfca4e04d28ebc41138aDale Johannesen uint32_t getHashValue() const; 249343e770983dcf53a1ea2dfca4e04d28ebc41138aDale Johannesen 250b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner private: 251b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner 252b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner /* Trivial queries. */ 253b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner integerPart *significandParts(); 254b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner const integerPart *significandParts() const; 255b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner unsigned int partCount() const; 256b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner 257b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner /* Significand operations. */ 258b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner integerPart addSignificand(const APFloat &); 259b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner integerPart subtractSignificand(const APFloat &, integerPart); 260b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner lostFraction addOrSubtractSignificand(const APFloat &, bool subtract); 261b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner lostFraction multiplySignificand(const APFloat &, const APFloat *); 262b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner lostFraction divideSignificand(const APFloat &); 263b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner void incrementSignificand(); 264b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner void initialize(const fltSemantics *); 265b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner void shiftSignificandLeft(unsigned int); 266b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner lostFraction shiftSignificandRight(unsigned int); 267b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner unsigned int significandLSB() const; 268b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner unsigned int significandMSB() const; 269b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner void zeroSignificand(); 270b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner 271b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner /* Arithmetic on special values. */ 272b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner opStatus addOrSubtractSpecials(const APFloat &, bool subtract); 273b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner opStatus divideSpecials(const APFloat &); 274b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner opStatus multiplySpecials(const APFloat &); 275b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner 276b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner /* Miscellany. */ 277e5e0194583c9d95cae685da139531624e050d39eNeil Booth void makeNaN(void); 278b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner opStatus normalize(roundingMode, lostFraction); 279b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner opStatus addOrSubtract(const APFloat &, roundingMode, bool subtract); 280b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner cmpResult compareAbsoluteValue(const APFloat &) const; 281b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner opStatus handleOverflow(roundingMode); 282b7dea4cb368c7b2e825e6d58b249693736a32e21Neil Booth bool roundAwayFromZero(roundingMode, lostFraction, unsigned int) const; 283ee7ae384f5d6067f1ca6d475b8630fe91ff2f6b6Neil Booth opStatus convertToSignExtendedInteger(integerPart *, unsigned int, bool, 284ee7ae384f5d6067f1ca6d475b8630fe91ff2f6b6Neil Booth roundingMode) const; 285643ce59495702ef29573b725d7431638be1c136aNeil Booth opStatus convertFromUnsignedParts(const integerPart *, unsigned int, 286643ce59495702ef29573b725d7431638be1c136aNeil Booth roundingMode); 287b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner opStatus convertFromHexadecimalString(const char *, roundingMode); 28896c7471b39dc77d4f29658212e5a72e575b23c39Neil Booth opStatus convertFromDecimalString (const char *, roundingMode); 289a30b0ee959b53e83ed3697ee0b704a493829dc04Neil Booth char *convertNormalToHexString(char *, unsigned int, bool, 290a30b0ee959b53e83ed3697ee0b704a493829dc04Neil Booth roundingMode) const; 29196c7471b39dc77d4f29658212e5a72e575b23c39Neil Booth opStatus roundSignificandWithExponent(const integerPart *, unsigned int, 29296c7471b39dc77d4f29658212e5a72e575b23c39Neil Booth int, roundingMode); 29396c7471b39dc77d4f29658212e5a72e575b23c39Neil Booth 2943f6eb7419de437436265831fce92f62498556e08Dale Johannesen APInt convertFloatAPFloatToAPInt() const; 2953f6eb7419de437436265831fce92f62498556e08Dale Johannesen APInt convertDoubleAPFloatToAPInt() const; 2963f6eb7419de437436265831fce92f62498556e08Dale Johannesen APInt convertF80LongDoubleAPFloatToAPInt() const; 297a471c2ecda37cd1bae0d94e832f002caa7b63216Dale Johannesen APInt convertPPCDoubleDoubleAPFloatToAPInt() const; 298a471c2ecda37cd1bae0d94e832f002caa7b63216Dale Johannesen void initFromAPInt(const APInt& api, bool isIEEE = false); 2993f6eb7419de437436265831fce92f62498556e08Dale Johannesen void initFromFloatAPInt(const APInt& api); 3003f6eb7419de437436265831fce92f62498556e08Dale Johannesen void initFromDoubleAPInt(const APInt& api); 3013f6eb7419de437436265831fce92f62498556e08Dale Johannesen void initFromF80LongDoubleAPInt(const APInt& api); 302a471c2ecda37cd1bae0d94e832f002caa7b63216Dale Johannesen void initFromPPCDoubleDoubleAPInt(const APInt& api); 303b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner 304b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner void assign(const APFloat &); 305b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner void copySignificand(const APFloat &); 306b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner void freeSignificand(); 307b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner 308b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner /* What kind of semantics does this value obey? */ 309b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner const fltSemantics *semantics; 310b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner 311b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner /* Significand - the fraction with an explicit integer bit. Must be 312b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner at least one bit wider than the target precision. */ 313b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner union Significand 314b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner { 315b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner integerPart part; 316b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner integerPart *parts; 317b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner } significand; 318b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner 319b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner /* The exponent - a signed number. */ 320b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner exponent_t exponent; 321b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner 322b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner /* What kind of floating point number this is. */ 323117acf9e36a0789d56b52525e031f575f80fe169Neil Booth /* Only 2 bits are required, but VisualStudio incorrectly sign extends 324418d360518811121ad9352af57fdd7ba58a4f917Chuck Rose III it. Using the extra bit keeps it from failing under VisualStudio */ 325418d360518811121ad9352af57fdd7ba58a4f917Chuck Rose III fltCategory category: 3; 326b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner 327b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner /* The sign bit of this number. */ 328b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner unsigned int sign: 1; 329a471c2ecda37cd1bae0d94e832f002caa7b63216Dale Johannesen 330a471c2ecda37cd1bae0d94e832f002caa7b63216Dale Johannesen /* For PPCDoubleDouble, we have a second exponent and sign (the second 331a471c2ecda37cd1bae0d94e832f002caa7b63216Dale Johannesen significand is appended to the first one, although it would be wrong to 332a471c2ecda37cd1bae0d94e832f002caa7b63216Dale Johannesen regard these as a single number for arithmetic purposes). These fields 333a471c2ecda37cd1bae0d94e832f002caa7b63216Dale Johannesen are not meaningful for any other type. */ 334a471c2ecda37cd1bae0d94e832f002caa7b63216Dale Johannesen exponent_t exponent2 : 11; 335a471c2ecda37cd1bae0d94e832f002caa7b63216Dale Johannesen unsigned int sign2: 1; 336b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner }; 337b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner} /* namespace llvm */ 338b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner 339b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner#endif /* LLVM_FLOAT_H */ 340