diff options
author | Ian Lynagh <igloo@earth.li> | 2011-09-17 18:20:41 +0100 |
---|---|---|
committer | Ian Lynagh <igloo@earth.li> | 2011-09-17 18:22:15 +0100 |
commit | 680c1a9ef3aa47ad45455ddabe5e238ec1cf6559 (patch) | |
tree | e03b72a547cee872516d7c500941bfd52a15ecd3 | |
parent | 9935359fad9203b34ea90a3bd92095e702526562 (diff) | |
download | haskell-680c1a9ef3aa47ad45455ddabe5e238ec1cf6559.tar.gz |
Define mkInteger
Now used by GHC to generate Integer literals.
-rw-r--r-- | libraries/integer-gmp/GHC/Integer.lhs | 2 | ||||
-rw-r--r-- | libraries/integer-gmp/GHC/Integer/Type.lhs | 10 |
2 files changed, 11 insertions, 1 deletions
diff --git a/libraries/integer-gmp/GHC/Integer.lhs b/libraries/integer-gmp/GHC/Integer.lhs index 392d3de79c..bc61d0394d 100644 --- a/libraries/integer-gmp/GHC/Integer.lhs +++ b/libraries/integer-gmp/GHC/Integer.lhs @@ -18,7 +18,7 @@ #include "MachDeps.h" module GHC.Integer ( - Integer, + Integer, mkInteger, smallInteger, wordToInteger, integerToWord, integerToInt, #if WORD_SIZE_IN_BITS < 64 integerToWord64, word64ToInteger, diff --git a/libraries/integer-gmp/GHC/Integer/Type.lhs b/libraries/integer-gmp/GHC/Integer/Type.lhs index eef256b274..401544d205 100644 --- a/libraries/integer-gmp/GHC/Integer/Type.lhs +++ b/libraries/integer-gmp/GHC/Integer/Type.lhs @@ -72,6 +72,16 @@ data Integer = S# Int# -- small integers | J# Int# ByteArray# -- large integers +mkInteger :: Bool -- non-negative? + -> [Int] -- absolute value in 31 bit chunks, least significant first + -- ideally these would be Words rather than Ints, but + -- we don't have Word available at the moment. + -> Integer +mkInteger nonNegative is = let abs = f is + in if nonNegative then abs else negateInteger abs + where f [] = S# 0# + f (I# i : is') = S# i `orInteger` shiftLInteger (f is') 31# + {-# NOINLINE smallInteger #-} smallInteger :: Int# -> Integer smallInteger i = S# i |