Define mkInteger
authorIan Lynagh <igloo@earth.li>
Sat, 17 Sep 2011 18:45:44 +0000 (19:45 +0100)
committerIan Lynagh <igloo@earth.li>
Sat, 17 Sep 2011 18:45:44 +0000 (19:45 +0100)
Now used by GHC to generate Integer literals.

libraries/integer-simple/GHC/Integer.hs
libraries/integer-simple/GHC/Integer/Type.hs

index 66e35c9..c9b50a7 100644 (file)
@@ -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,
index 7d1a90e..02eeef2 100644 (file)
@@ -51,6 +51,16 @@ type Digit = Word#
 -- XXX Could move [] above us
 data List a = Nil | Cons a (List a)
 
+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 [] = Naught
+          f (I# i : is') = smallInteger i `orInteger` shiftLInteger (f is') 31#
+
 errorInteger :: Integer
 errorInteger = Positive errorPositive