summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Support/APInt.cpp
Commit message (Collapse)AuthorAgeFilesLines
...
* 1. Make sure all delete operators of arrays use the array form of delete.Reid Spencer2007-02-261-19/+45
| | | | | | | | | | | | | | 2. Rewrite operator=(const APInt& RHS) to allow the RHS to be a different bit width than the LHS. This makes it possible to use APInt as the key of a DenseMap, as needed for the IntConstants map in Constants.cpp 3. Fix operator=(uint64_t) to clear unused bits in case the client assigns a value that has more bits than the APInt allows. 4. Assert that bit widths are equal in operator== 5. Revise getHashValue() to put the bit width in the low order six bits. This should help to make i1 0, i2 0, ... i64 0 all distinct in the IntConstants DenseMap. llvm-svn: 34646
* Implement the getHashValue method.Reid Spencer2007-02-261-1/+16
| | | | | | Fix toString use of getValue to use getZExtValue() llvm-svn: 34642
* Re-enable this. The header was committed.Reid Spencer2007-02-261-4/+0
| | | | llvm-svn: 34634
* another missing header :( :( :(Chris Lattner2007-02-261-0/+4
| | | | llvm-svn: 34632
* 1. Remove redundant calls to clearUsedBits().Reid Spencer2007-02-261-44/+79
| | | | | | | | | | 2. Fix countTrailingZeros to use a faster algorithm. 3. Simplify sext() slightly by using isNegative(). 4. Implement ashr using word-at-a-time logic instead of bit-at-a-time 5. Rename locals named isNegative so they don't clash with method name. 6. Fix fromString to compute negated value correctly. llvm-svn: 34629
* Rewrite lshr to not do bit by bit copy but to copy and shift whole words.Reid Spencer2007-02-261-15/+42
| | | | | | This makes it much more efficient. llvm-svn: 34618
* Fix sext operation. Shifting by zero would leave an incorrect mask.Reid Spencer2007-02-251-1/+1
| | | | llvm-svn: 34617
* 1. Fix the flip() method to correctly flip all words of the APInt.Reid Spencer2007-02-251-13/+89
| | | | | | | 2. Implement the trunc, sext, and zext operations. 3. Improve fromString to accept negative values as input. llvm-svn: 34616
* 1. Provide more detail in file comment.Reid Spencer2007-02-251-189/+145
| | | | | | | | | | | | | | 2. Move comments for methods to .h file, delete them in .cpp file. 3. All places that were doing manual clear of high order bits now call the clearUnusedBits() method in order to not depend on undefined behavior of the >> operator when the number of bits shifted equals the word size. 4. Reduced # of loc by using the new result of clearUnusedBits() method. 5. Simplified logic (decreased indentation) in a few places. 6. Added code comments to larger functions that needed them. 7. Added FIXME notes about weak implementations of things (e.g. bit-by-bit shift right is sub-optimal). llvm-svn: 34603
* Allow this to compile now that the header file is checked in.Reid Spencer2007-02-251-4/+0
| | | | llvm-svn: 34581
* this doesn't compile, disable itChris Lattner2007-02-251-0/+4
| | | | llvm-svn: 34571
* Clean up lshr and ashr to coding standards.Reid Spencer2007-02-251-53/+79
| | | | | | Handle the single word cases for shiftAmt == BitWidth. llvm-svn: 34569
* Whoops, last word with bits in large shift left wasn't correct.Reid Spencer2007-02-251-1/+1
| | | | llvm-svn: 34565
* Fix the > 64 bits case for left shift.Reid Spencer2007-02-251-22/+47
| | | | llvm-svn: 34564
* Fix the remainder shifting in KnuthDiv.Reid Spencer2007-02-241-6/+13
| | | | llvm-svn: 34562
* 1. Fix a bug in fromString for the <= 64bits caseReid Spencer2007-02-241-17/+29
| | | | | | 2. Fix shl when shiftAmount == BitWidth. llvm-svn: 34560
* 1. Fix last bug in KnuthDiv. All divide tests pass up to 1024 bits now.Reid Spencer2007-02-241-63/+55
| | | | | | | | | | 2. Clean up comments, style, coding standards, etc. 3. Simplify a constructor. Extended testing revealed some additional bugs in shifting. I'll fix these tomorrow. llvm-svn: 34559
* 1. Make internal functions take const arguments where they should, justReid Spencer2007-02-241-21/+61
| | | | | | | | | | | | | | to be safe. 2. Make internal functions that return a carry/borrow return bool instead of uint64_t because the carry/borrow can only be in range [0,1]. 3. Assert that the pointers to KnuthDiv are all different so that the result and operands can't overlap. 4. Add debug output to KnuthDiv function. 5. Fix a problem with KnuthDiv by separating the b's complement operation from the subtraction borrow operation. This fixes a wide range of division problems, but alas, not all of them. llvm-svn: 34554
* 1. Fix a carry out problem in add if destination and x point to the sameReid Spencer2007-02-231-92/+43
| | | | | | | | | memory (as done in fromString). 2. Implement Knuth divide more closely to what is recommended in his book. 3. Fix computation of the remainder for Knuth Divide (bad shifting). 4. Remove some cruft from the file llvm-svn: 34518
* When converting from 64 to 32-bits, use the actual number of words toReid Spencer2007-02-221-2/+2
| | | | | | | extract the value, not the number of words implied by the active bits. This fixes numerous, but not all divide bugs. llvm-svn: 34484
* Fix countLeadingZeros in the case that the bitwidth evenly divides theReid Spencer2007-02-221-1/+4
| | | | | | | | word size. This fixes all reads of uninitialized data (buffer over read) and makes APInt.cpp memory clean, per valgrind. The only remaining problem is division in a few cases. llvm-svn: 34483
* Reorganize some code to make it clearer, avoid a few uninitialized memoryReid Spencer2007-02-211-56/+57
| | | | | | reads, and reduce the number of temporary APInt instances we construct. llvm-svn: 34467
* Fix the carry in addition.Reid Spencer2007-02-211-2/+2
| | | | llvm-svn: 34465
* 1. Add a dump() method for faster debugging.Reid Spencer2007-02-211-81/+80
| | | | | | | | | | | | | | 2. Change 0 initialization of union to larger component so all is zeroed. 3. Fix the borrow logic in subtraction so it works for > 128 bits. 4. Rewrite fromString to use a simpler but correct algorithm and also to not set the bit width contrary to the user's request. 5. Optimize toString a bit by making it only do one Knuth divide per iteration instead of two. With these changes, all arithmetic passes (verified by pari/GP) up to 1024 bits except for certain division cases. llvm-svn: 34463
* Fix countLeadingZeros to actually return the correct number.Reid Spencer2007-02-211-11/+13
| | | | | | Fix toString to correctly return "0" for zero valued APInts over 128 bits. llvm-svn: 34459
* Make long addition and subtraction work. Speed things up by using internalReid Spencer2007-02-201-72/+69
| | | | | | functions more. llvm-svn: 34458
* Clean up variable names in operator*.Reid Spencer2007-02-201-8/+8
| | | | | | Attempt #3 for getting a portable INFINITY value. llvm-svn: 34454
* Use INFINITY macro from math.h instead of constructing hex floating pointReid Spencer2007-02-201-2/+3
| | | | | | constants (avoids warnings). llvm-svn: 34452
* First version that can process arith.cpp test case up to 1024 bits:Reid Spencer2007-02-201-171/+423
| | | | | | | | | | | | | | | | | | | | | 1. Ensure pVal is set to 0 in each constructor. 2. Fix roundToDouble to make correct calculations and not read beyond the end of allocated memory. 3. Implement Knuth's "classical algorithm" for division from scratch and eliminate buffer overflows and uninitialized mememory reads. Document it properly too. 4. Implement a wrapper function for KnuthDiv which handles the 64-bit to 32-bit conversion and back. It also implement short division for the n == 1 case that Knuth's algorithm can't handle. 5. Simplify the logic of udiv and urem a little, make them exit early, and have them use the "divide" wrapper function to perform the division or remainder operation. 6. Move the toString function to the end of the file, closer to where the division functions are located. Note: division is still broken for some > 64 bit values, but at least it doesn't crash any more. llvm-svn: 34449
* 1. Fix some indentation and variable names in the get{Min,Max}Value methods.Reid Spencer2007-02-181-8/+24
| | | | | | | | 2. Implement toString for power-of-2 radix without using divide and always printing full words. This allows hex/binary to look at the bit respresentation of the APInt as well as avoid bugs in divide. llvm-svn: 34396
* 1. Use APINT_WORD_SIZE instead of sizeof(uint64_t)Reid Spencer2007-02-181-42/+59
| | | | | | | 2. Teach slt about signedness. 3. Teach roundToDouble to properly sign extend. llvm-svn: 34391
* 1. Remove dead code (lshift function).Reid Spencer2007-02-181-227/+218
| | | | | | | | | | | | 2. Consolidate memory allocation into just two inline functions. 3. Convert "unsigned" to uint32_t to gaurantee its size. 4. Eliminate magic constants and replace with symbolic equivalent. 5. Improve code documentation slightly. 6. Simplify the logical operator code because bitwidths must be the same. 7. Fix indentation per coding standards. 8. Use exit-early style to reduce indentation in several functions. llvm-svn: 34389
* Make add_1 exit early if carry is 0.Reid Spencer2007-02-181-36/+23
| | | | | | | Fix line breaks and 80 cols violation. Simplify operator^= since bitwidths must be the same. llvm-svn: 34388
* Implement signed output for toString.Reid Spencer2007-02-181-44/+75
| | | | | | Fix bugs in countLeadingZeros and countTrailingZeros. llvm-svn: 34386
* Fix some bugs in division logic.Reid Spencer2007-02-171-3/+5
| | | | llvm-svn: 34384
* Move static functions closer to their usage.Reid Spencer2007-02-171-295/+295
| | | | llvm-svn: 34363
* Clean up the divide and remainder logic a bit (exit early). Use moreReid Spencer2007-02-171-63/+88
| | | | | | meaningful variable names. Add comments to document the flow. llvm-svn: 34362
* Fix bugs introduced by constructor parameter order change.Reid Spencer2007-02-171-13/+29
| | | | llvm-svn: 34357
* Review changes:Reid Spencer2007-02-161-186/+183
| | | | | | | | | | | | | | | 1. Function style changes. 2. 80-col violations. 3. Better names for things. 4. Arrange constructors so they all take bit width first. 5. Add named signed and unsigned comparison functions and remove the corresponding operators. 6. Remove operator&& and operator|| but provide a getBoolValue function which converts to bool as comparison against 0. This allows the normal && and || operators to be used as if (X.getBoolValue() && Y.getBoolValue()) Note: this still doesn't function 100% yet. I'm working on the bugs now. llvm-svn: 34353
* Fix some buges:Zhou Sheng2007-02-151-43/+58
| | | | | | | | | 1. Make getMinValue() returns the right value. 2. Fix the ByteSwap() crash problem. 3. Make Postfix increment work correctly. 4. Fix some bugs in LogBase2, Hi/LoBits and UDiv. llvm-svn: 34304
* Use brute-force algorithm for to_string. It doesn't have to be efficientReid Spencer2007-02-141-28/+35
| | | | | | at this point, it just needs to work so we can test things reliably. llvm-svn: 34262
* Make some minor improvements to APInt:Reid Spencer2007-02-131-15/+11
| | | | | | | | | 1. Make all the operators use uppercase 2. Rename APIntRoundToDouble method just RoundToDouble, the APInt is redundant. 3. Turn the class on for compilation. llvm-svn: 34253
* 1. Make APInt::shl work correctly and more efficiently.Zhou Sheng2007-02-121-10/+78
| | | | | | | 2. Add functions to support the numberical conversion between APInt and double/float. llvm-svn: 34201
* Eliminates friend function declaration inside APInt, instead, adds publicZhou Sheng2007-02-091-23/+23
| | | | | | methods as those global function's internal implementation. llvm-svn: 34083
* Switched this file on accidently.Zhou Sheng2007-02-081-1/+1
| | | | llvm-svn: 34054
* As Chris and Reid suggested, remove "isSigned" field from APInt, instead,Zhou Sheng2007-02-081-178/+170
| | | | | | | | add some signed/unsigned arithmetic operation functions into APInt.h to handle the signed/unsigned issue. These functions will be defined inside a namespace "APIntOps" which is inside llvm namespace. llvm-svn: 34053
* As Chris suggested, fixed some problems. (This is the first part)Zhou Sheng2007-02-071-147/+157
| | | | llvm-svn: 33989
* As Reid suggested, fixed some problems.Zhou Sheng2007-02-061-150/+143
| | | | llvm-svn: 33955
* Disable this for now.Chris Lattner2007-02-061-0/+5
| | | | llvm-svn: 33953
* Add a class APInt to represent arbitrary precision constant integral values.Zhou Sheng2007-02-061-0/+1113
It is a functional replacement for common case integer type like "unsigned", "uint64_t", but also allows non-byte-width integer type and large integer value types such as 3-bits, 15-bits, or more than 64-bits of precision. For more details, see pr1043. llvm-svn: 33951
OpenPOWER on IntegriCloud