#include "MachDeps.h"
module GHC.Integer.GMP.Prim (
cmpInteger#,
cmpIntegerInt#,
plusInteger#,
minusInteger#,
timesInteger#,
quotRemInteger#,
quotInteger#,
remInteger#,
divModInteger#,
divInteger#,
modInteger#,
divExactInteger#,
gcdInteger#,
gcdIntegerInt#,
gcdInt#,
decodeDouble#,
int2Integer#,
integer2Int#,
word2Integer#,
integer2Word#,
andInteger#,
orInteger#,
xorInteger#,
complementInteger#,
mul2ExpInteger#,
fdivQ2ExpInteger#,
#if WORD_SIZE_IN_BITS < 64
int64ToInteger#, integerToInt64#,
word64ToInteger#, integerToWord64#,
#endif
#ifndef WORD_SIZE_IN_BITS
#error WORD_SIZE_IN_BITS not defined!!!
#endif
) where
import GHC.Prim
default ()
foreign import prim "integer_cmm_cmpIntegerzh" cmpInteger#
:: Int# -> ByteArray# -> Int# -> ByteArray# -> Int#
foreign import prim "integer_cmm_cmpIntegerIntzh" cmpIntegerInt#
:: Int# -> ByteArray# -> Int# -> Int#
foreign import prim "integer_cmm_plusIntegerzh" plusInteger#
:: Int# -> ByteArray# -> Int# -> ByteArray# -> (# Int#, ByteArray# #)
foreign import prim "integer_cmm_minusIntegerzh" minusInteger#
:: Int# -> ByteArray# -> Int# -> ByteArray# -> (# Int#, ByteArray# #)
foreign import prim "integer_cmm_timesIntegerzh" timesInteger#
:: Int# -> ByteArray# -> Int# -> ByteArray# -> (# Int#, ByteArray# #)
foreign import prim "integer_cmm_quotRemIntegerzh" quotRemInteger#
:: Int# -> ByteArray# -> Int# -> ByteArray# -> (# Int#, ByteArray#, Int#, ByteArray# #)
foreign import prim "integer_cmm_quotIntegerzh" quotInteger#
:: Int# -> ByteArray# -> Int# -> ByteArray# -> (# Int#, ByteArray# #)
foreign import prim "integer_cmm_remIntegerzh" remInteger#
:: Int# -> ByteArray# -> Int# -> ByteArray# -> (# Int#, ByteArray# #)
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# #)
foreign import prim "integer_cmm_divExactIntegerzh" divExactInteger#
:: Int# -> ByteArray# -> Int# -> ByteArray# -> (# Int#, ByteArray# #)
foreign import prim "integer_cmm_gcdIntegerzh" gcdInteger#
:: Int# -> ByteArray# -> Int# -> ByteArray# -> (# Int#, ByteArray# #)
foreign import prim "integer_cmm_gcdIntegerIntzh" gcdIntegerInt#
:: Int# -> ByteArray# -> Int# -> Int#
foreign import prim "integer_cmm_gcdIntzh" gcdInt#
:: Int# -> Int# -> Int#
foreign import prim "integer_cmm_decodeDoublezh" decodeDouble#
:: Double# -> (# Int#, Int#, ByteArray# #)
foreign import prim "integer_cmm_int2Integerzh" int2Integer#
:: Int# -> (# Int#, ByteArray# #)
foreign import prim "integer_cmm_word2Integerzh" word2Integer#
:: Word# -> (# Int#, ByteArray# #)
foreign import prim "integer_cmm_andIntegerzh" andInteger#
:: Int# -> ByteArray# -> Int# -> ByteArray# -> (# Int#, ByteArray# #)
foreign import prim "integer_cmm_orIntegerzh" orInteger#
:: Int# -> ByteArray# -> Int# -> ByteArray# -> (# Int#, ByteArray# #)
foreign import prim "integer_cmm_xorIntegerzh" xorInteger#
:: Int# -> ByteArray# -> Int# -> ByteArray# -> (# Int#, ByteArray# #)
foreign import prim "integer_cmm_mul2ExpIntegerzh" mul2ExpInteger#
:: Int# -> ByteArray# -> Int# -> (# Int#, ByteArray# #)
foreign import prim "integer_cmm_fdivQ2ExpIntegerzh" fdivQ2ExpInteger#
:: Int# -> ByteArray# -> Int# -> (# Int#, ByteArray# #)
foreign import prim "integer_cmm_complementIntegerzh" complementInteger#
:: Int# -> ByteArray# -> (# Int#, ByteArray# #)
#if WORD_SIZE_IN_BITS < 64
foreign import prim "integer_cmm_int64ToIntegerzh" int64ToInteger#
:: Int64# -> (# Int#, ByteArray# #)
foreign import prim "integer_cmm_word64ToIntegerzh" word64ToInteger#
:: Word64# -> (# Int#, ByteArray# #)
foreign import ccall unsafe "hs_integerToInt64"
integerToInt64# :: Int# -> ByteArray# -> Int64#
foreign import ccall unsafe "hs_integerToWord64"
integerToWord64# :: Int# -> ByteArray# -> Word64#
#endif
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)