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

GHC/Integer.lhs
GHC/Integer/Type.lhs

index 392d3de..bc61d03 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 eef256b..401544d 100644 (file)
@@ -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