summaryrefslogtreecommitdiff
path: root/libraries/base/GHC/Real.hs
diff options
context:
space:
mode:
Diffstat (limited to 'libraries/base/GHC/Real.hs')
-rw-r--r--libraries/base/GHC/Real.hs105
1 files changed, 58 insertions, 47 deletions
diff --git a/libraries/base/GHC/Real.hs b/libraries/base/GHC/Real.hs
index ed5fcd022c..c47764f7a3 100644
--- a/libraries/base/GHC/Real.hs
+++ b/libraries/base/GHC/Real.hs
@@ -326,34 +326,40 @@ instance Real Int where
instance Integral Int where
toInteger (I# i) = IS i
+ {-# INLINE quot #-} -- see Note [INLINE division wrappers] in GHC.Base
a `quot` b
| b == 0 = divZeroError
| b == (-1) && a == minBound = overflowError -- Note [Order of tests]
-- in GHC.Int
| otherwise = a `quotInt` b
+ {-# INLINE rem #-} -- see Note [INLINE division wrappers] in GHC.Base
!a `rem` b -- See Note [Special case of mod and rem is lazy]
| b == 0 = divZeroError
| b == (-1) = 0
| otherwise = a `remInt` b
+ {-# INLINE div #-} -- see Note [INLINE division wrappers] in GHC.Base
a `div` b
| b == 0 = divZeroError
| b == (-1) && a == minBound = overflowError -- Note [Order of tests]
-- in GHC.Int
| otherwise = a `divInt` b
+ {-# INLINE mod #-} -- see Note [INLINE division wrappers] in GHC.Base
!a `mod` b -- See Note [Special case of mod and rem is lazy]
| b == 0 = divZeroError
| b == (-1) = 0
| otherwise = a `modInt` b
+ {-# INLINE quotRem #-} -- see Note [INLINE division wrappers] in GHC.Base
a `quotRem` b
| b == 0 = divZeroError
-- Note [Order of tests] in GHC.Int
| b == (-1) && a == minBound = (overflowError, 0)
| otherwise = a `quotRemInt` b
+ {-# INLINE divMod #-} -- see Note [INLINE division wrappers] in GHC.Base
a `divMod` b
| b == 0 = divZeroError
-- Note [Order of tests] in GHC.Int
@@ -379,26 +385,32 @@ instance Real Word where
-- | @since 2.01
instance Integral Word where
+ -- see Note [INLINE division wrappers] in GHC.Base
+ {-# INLINE quot #-}
+ {-# INLINE rem #-}
+ {-# INLINE quotRem #-}
+ {-# INLINE div #-}
+ {-# INLINE mod #-}
+ {-# INLINE divMod #-}
+
quot (W# x#) y@(W# y#)
| y /= 0 = W# (x# `quotWord#` y#)
| otherwise = divZeroError
+
rem (W# x#) y@(W# y#)
| y /= 0 = W# (x# `remWord#` y#)
| otherwise = divZeroError
- div (W# x#) y@(W# y#)
- | y /= 0 = W# (x# `quotWord#` y#)
- | otherwise = divZeroError
- mod (W# x#) y@(W# y#)
- | y /= 0 = W# (x# `remWord#` y#)
- | otherwise = divZeroError
+
quotRem (W# x#) y@(W# y#)
| y /= 0 = case x# `quotRemWord#` y# of
(# q, r #) ->
(W# q, W# r)
| otherwise = divZeroError
- divMod (W# x#) y@(W# y#)
- | y /= 0 = (W# (x# `quotWord#` y#), W# (x# `remWord#` y#))
- | otherwise = divZeroError
+
+ div x y = quot x y
+ mod x y = rem x y
+ divMod x y = quotRem x y
+
toInteger (W# x#) = integerFromWord# x#
--------------------------------------------------------------
@@ -427,59 +439,58 @@ instance Real Natural where
-- | @since 2.0.1
instance Integral Integer where
+ -- see Note [INLINE division wrappers] in GHC.Base
+ {-# INLINE quot #-}
+ {-# INLINE rem #-}
+ {-# INLINE quotRem #-}
+ {-# INLINE div #-}
+ {-# INLINE mod #-}
+ {-# INLINE divMod #-}
+
toInteger n = n
- {-# INLINE quot #-}
- _ `quot` 0 = divZeroError
- n `quot` d = n `integerQuot` d
+ !_ `quot` 0 = divZeroError
+ n `quot` d = n `integerQuot` d
- {-# INLINE rem #-}
- _ `rem` 0 = divZeroError
- n `rem` d = n `integerRem` d
+ !_ `rem` 0 = divZeroError
+ n `rem` d = n `integerRem` d
- {-# INLINE div #-}
- _ `div` 0 = divZeroError
- n `div` d = n `integerDiv` d
+ !_ `div` 0 = divZeroError
+ n `div` d = n `integerDiv` d
- {-# INLINE mod #-}
- _ `mod` 0 = divZeroError
- n `mod` d = n `integerMod` d
+ !_ `mod` 0 = divZeroError
+ n `mod` d = n `integerMod` d
- {-# INLINE divMod #-}
- _ `divMod` 0 = divZeroError
- n `divMod` d = n `integerDivMod` d
+ !_ `divMod` 0 = divZeroError
+ n `divMod` d = n `integerDivMod` d
- {-# INLINE quotRem #-}
- _ `quotRem` 0 = divZeroError
- n `quotRem` d = n `integerQuotRem` d
+ !_ `quotRem` 0 = divZeroError
+ n `quotRem` d = n `integerQuotRem` d
-- | @since 4.8.0.0
instance Integral Natural where
- toInteger x = integerFromNatural x
-
- {-# INLINE quot #-}
- _ `quot` 0 = divZeroError
- n `quot` d = n `naturalQuot` d
+ -- see Note [INLINE division wrappers] in GHC.Base
+ {-# INLINE quot #-}
+ {-# INLINE rem #-}
+ {-# INLINE quotRem #-}
+ {-# INLINE div #-}
+ {-# INLINE mod #-}
+ {-# INLINE divMod #-}
- {-# INLINE rem #-}
- _ `rem` 0 = divZeroError
- n `rem` d = n `naturalRem` d
+ toInteger = integerFromNatural
- {-# INLINE div #-}
- _ `div` 0 = divZeroError
- n `div` d = n `naturalQuot` d
+ !_ `quot` 0 = divZeroError
+ n `quot` d = n `naturalQuot` d
- {-# INLINE mod #-}
- _ `mod` 0 = divZeroError
- n `mod` d = n `naturalRem` d
+ !_ `rem` 0 = divZeroError
+ n `rem` d = n `naturalRem` d
- {-# INLINE divMod #-}
- _ `divMod` 0 = divZeroError
- n `divMod` d = n `naturalQuotRem` d
+ !_ `quotRem` 0 = divZeroError
+ n `quotRem` d = n `naturalQuotRem` d
- {-# INLINE quotRem #-}
- _ `quotRem` 0 = divZeroError
- n `quotRem` d = n `naturalQuotRem` d
+ div x y = quot x y
+ mod x y = rem x y
+ divMod x y = quotRem x y
--------------------------------------------------------------
-- Instances for @Ratio@