implement integer2Int# and integer2Word# in Haskell, not foreign prim
authorSimon Marlow <marlowsd@gmail.com>
Fri, 13 Aug 2010 15:29:26 +0000 (15:29 +0000)
committerSimon Marlow <marlowsd@gmail.com>
Fri, 13 Aug 2010 15:29:26 +0000 (15:29 +0000)
libraries/integer-gmp/GHC/Integer/GMP/Internals.hs
libraries/integer-gmp/cbits/gmp-wrappers.cmm

index e3fd393..44bbec5 100644 (file)
@@ -51,7 +51,7 @@ module GHC.Integer.GMP.Internals (
 
   ) where
 
-import GHC.Prim (Int#, Word#, Double#, ByteArray#)
+import GHC.Prim
 import GHC.Integer.Type
 
 #if WORD_SIZE_IN_BITS < 64
@@ -143,21 +143,11 @@ foreign import prim "integer_cmm_int2Integerzh" int2Integer#
 
 -- |
 --
-foreign import prim "integer_cmm_integer2Intzh" integer2Int#
-  :: Int# -> ByteArray# -> Int#
-
--- |
---
 foreign import prim "integer_cmm_word2Integerzh" word2Integer#
   :: Word# -> (# Int#, ByteArray# #)
 
 -- |
 --
-foreign import prim "integer_cmm_integer2Wordzh" integer2Word#
-  :: Int# -> ByteArray# -> Word#
-
--- |
---
 foreign import prim "integer_cmm_andIntegerzh" andInteger#
   :: Int# -> ByteArray# -> Int# -> ByteArray# -> (# Int#, ByteArray# #)
 
@@ -199,3 +189,15 @@ foreign import ccall unsafe "hs_integerToInt64"
 foreign import ccall unsafe "hs_integerToWord64"
     integerToWord64# :: Int# -> ByteArray# -> Word64#
 #endif
+
+-- used to be primops:
+integer2Int# :: Int# -> ByteArray# -> Int#
+integer2Int# s d = if s ==# 0#
+                       then 0#
+                       else let !v = indexIntArray# d 0# in
+                            if s <# 0#
+                               then negateInt# v
+                               else v
+
+integer2Word# :: Int# -> ByteArray# -> Word#
+integer2Word# s d = int2Word# (integer2Int# s d)
index e41be8f..a347f7c 100644 (file)
@@ -509,44 +509,6 @@ integer_cmm_cmpIntegerzh
     jump %ENTRY_CODE(Sp(0));
 }
 
-integer_cmm_integer2Intzh
-{
-    /* R1 = s; R2 = d */
-    W_ r, s;
-
-    s = R1;
-    if (s == 0) {
-        r = 0;
-    } else {
-        r = W_[R2 + SIZEOF_StgArrWords];
-        if (%lt(s,0)) {
-            r = -r;
-        }
-    }
-    /* Result parked in R1, return via info-pointer at TOS */
-    R1 = r;
-    jump %ENTRY_CODE(Sp(0));
-}
-
-integer_cmm_integer2Wordzh
-{
-  /* R1 = s; R2 = d */
-  W_ r, s;
-
-  s = R1;
-  if (s == 0) {
-    r = 0;
-  } else {
-    r = W_[R2 + SIZEOF_StgArrWords];
-    if (%lt(s,0)) {
-        r = -r;
-    }
-  }
-  /* Result parked in R1, return via info-pointer at TOS */
-  R1 = r;
-  jump %ENTRY_CODE(Sp(0));
-}
-
 #define DOUBLE_MANTISSA_SIZE SIZEOF_DOUBLE
 #define ARR_SIZE (SIZEOF_StgArrWords + DOUBLE_MANTISSA_SIZE)