summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan Lynagh <igloo@earth.li>2011-09-17 18:20:41 +0100
committerIan Lynagh <igloo@earth.li>2011-09-17 18:22:15 +0100
commit680c1a9ef3aa47ad45455ddabe5e238ec1cf6559 (patch)
treee03b72a547cee872516d7c500941bfd52a15ecd3
parent9935359fad9203b34ea90a3bd92095e702526562 (diff)
downloadhaskell-680c1a9ef3aa47ad45455ddabe5e238ec1cf6559.tar.gz
Define mkInteger
Now used by GHC to generate Integer literals.
-rw-r--r--libraries/integer-gmp/GHC/Integer.lhs2
-rw-r--r--libraries/integer-gmp/GHC/Integer/Type.lhs10
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