Expose new internal exponentiation primitives
[packages/integer-gmp.git] / GHC / Integer / GMP / Prim.hs
index 8de4a8b..59aa6f4 100644 (file)
@@ -16,6 +16,8 @@ module GHC.Integer.GMP.Prim (
     quotInteger#,
     remInteger#,
     divModInteger#,
+    divInteger#,
+    modInteger#,
     divExactInteger#,
 
     gcdInteger#,
@@ -35,9 +37,14 @@ module GHC.Integer.GMP.Prim (
     xorInteger#,
     complementInteger#,
 
+    testBitInteger#,
     mul2ExpInteger#,
     fdivQ2ExpInteger#,
 
+    powInteger#,
+    powModInteger#,
+    recipModInteger#,
+
 #if WORD_SIZE_IN_BITS < 64
     int64ToInteger#,  integerToInt64#,
     word64ToInteger#, integerToWord64#,
@@ -50,6 +57,7 @@ module GHC.Integer.GMP.Prim (
   ) where
 
 import GHC.Prim
+import GHC.Types
 
 -- Double isn't available yet, and we shouldn't be using defaults anyway:
 default ()
@@ -101,6 +109,10 @@ foreign import prim "integer_cmm_remIntegerzh" remInteger#
 --
 foreign import prim "integer_cmm_divModIntegerzh" divModInteger#
   :: Int# -> ByteArray# -> Int# -> ByteArray# -> (# Int#, ByteArray#, Int#, ByteArray# #)
+foreign import prim "integer_cmm_divIntegerzh" divInteger#
+  :: Int# -> ByteArray# -> Int# -> ByteArray# -> (# Int#, ByteArray# #)
+foreign import prim "integer_cmm_modIntegerzh" modInteger#
+  :: Int# -> ByteArray# -> Int# -> ByteArray# -> (# Int#, ByteArray# #)
 
 -- | Divisor is guaranteed to be a factor of dividend.
 --
@@ -156,6 +168,11 @@ foreign import prim "integer_cmm_xorIntegerzh" xorInteger#
 
 -- |
 --
+foreign import prim "integer_cmm_testBitIntegerzh" testBitInteger#
+  :: Int# -> ByteArray# -> Int# -> Int#
+
+-- |
+--
 foreign import prim "integer_cmm_mul2ExpIntegerzh" mul2ExpInteger#
   :: Int# -> ByteArray# -> Int# -> (# Int#, ByteArray# #)
 
@@ -166,6 +183,21 @@ foreign import prim "integer_cmm_fdivQ2ExpIntegerzh" fdivQ2ExpInteger#
 
 -- |
 --
+foreign import prim "integer_cmm_powIntegerzh" powInteger#
+  :: Int# -> ByteArray# -> Word# -> (# Int#, ByteArray# #)
+
+-- |
+--
+foreign import prim "integer_cmm_powModIntegerzh" powModInteger#
+  :: Int# -> ByteArray# -> Int# -> ByteArray# -> Int# -> ByteArray# -> (# Int#, ByteArray# #)
+
+-- |
+--
+foreign import prim "integer_cmm_recipModIntegerzh" recipModInteger#
+  :: Int# -> ByteArray# -> Int# -> ByteArray# -> (# Int#, ByteArray# #)
+
+-- |
+--
 foreign import prim "integer_cmm_complementIntegerzh" complementInteger#
   :: Int# -> ByteArray# -> (# Int#, ByteArray# #)
 
@@ -185,10 +217,10 @@ foreign import ccall unsafe "hs_integerToWord64"
 
 -- used to be primops:
 integer2Int# :: Int# -> ByteArray# -> Int#
-integer2Int# s d = if s ==# 0#
+integer2Int# s d = if isTrue# (s ==# 0#)
                        then 0#
                        else let !v = indexIntArray# d 0# in
-                            if s <# 0#
+                            if isTrue# (s <# 0#)
                                then negateInt# v
                                else v