Move divInt#/modInt# from base
authorIan Lynagh <igloo@earth.li>
Tue, 19 Jun 2012 18:21:29 +0000 (19:21 +0100)
committerIan Lynagh <igloo@earth.li>
Tue, 19 Jun 2012 18:21:29 +0000 (19:21 +0100)
This allows them to be shared with integer-gmp

libraries/ghc-prim/GHC/Classes.hs
libraries/ghc-prim/GHC/Types.hs

index 7586af4..863a8fa 100644 (file)
@@ -1,5 +1,5 @@
 {-# LANGUAGE Trustworthy #-}
-{-# LANGUAGE NoImplicitPrelude, MagicHash, StandaloneDeriving #-}
+{-# LANGUAGE NoImplicitPrelude, MagicHash, StandaloneDeriving, BangPatterns #-}
 {-# OPTIONS_GHC -fno-warn-unused-imports #-}
 -- XXX -fno-warn-unused-imports needed for the GHC.Tuple import below. Sigh.
 {-# OPTIONS_HADDOCK hide #-}
@@ -285,3 +285,27 @@ deriving instance Ord Arity
 deriving instance Ord Associativity
 deriving instance Ord Fixity
 
+------------------------------------------------------------------------
+-- These don't really belong here, but we don't have a better place to
+-- put them
+
+divInt# :: Int# -> Int# -> Int#
+x# `divInt#` y#
+        -- Be careful NOT to overflow if we do any additional arithmetic
+        -- on the arguments...  the following  previous version of this
+        -- code has problems with overflow:
+--    | (x# ># 0#) && (y# <# 0#) = ((x# -# y#) -# 1#) `quotInt#` y#
+--    | (x# <# 0#) && (y# ># 0#) = ((x# -# y#) +# 1#) `quotInt#` y#
+    =      if (x# ># 0#) && (y# <# 0#) then ((x# -# 1#) `quotInt#` y#) -# 1#
+      else if (x# <# 0#) && (y# ># 0#) then ((x# +# 1#) `quotInt#` y#) -# 1#
+      else x# `quotInt#` y#
+
+modInt# :: Int# -> Int# -> Int#
+x# `modInt#` y#
+    = if (x# ># 0#) && (y# <# 0#) ||
+         (x# <# 0#) && (y# ># 0#)
+      then if r# /=# 0# then r# +# y# else 0#
+      else r#
+    where
+    !r# = x# `remInt#` y#
+
index c8868da..e7983e7 100644 (file)
@@ -84,3 +84,4 @@ newtype IO a = IO (State# RealWorld -> (# State# RealWorld, a #))
 -- The type constructor is special in that GHC pretends that it
 -- has kind (? -> ? -> Fact) rather than (* -> * -> *)
 data (~) a b = Eq# ((~#) a b)
+