diff options
author | Herbert Valerio Riedel <hvr@gnu.org> | 2016-03-11 10:39:30 +0100 |
---|---|---|
committer | Ben Gamari <ben@smart-cactus.org> | 2016-03-11 13:20:18 +0100 |
commit | f8056fca87e83fd37d3f2441f5cb0335e12e3aef (patch) | |
tree | f7915363f17f535bc036c13fad98346571d8c1dc /libraries/integer-gmp | |
parent | a74a3846c84ad55de3deeed8b2401a2ed514b2e1 (diff) | |
download | haskell-f8056fca87e83fd37d3f2441f5cb0335e12e3aef.tar.gz |
Make integer-gmp operations more strict
Reviewers: austin, goldfire, bgamari
Reviewed By: bgamari
Subscribers: thomie
Differential Revision: https://phabricator.haskell.org/D1984
GHC Trac Issues: #10691
Diffstat (limited to 'libraries/integer-gmp')
-rw-r--r-- | libraries/integer-gmp/src/GHC/Integer/Type.hs | 18 |
1 files changed, 9 insertions, 9 deletions
diff --git a/libraries/integer-gmp/src/GHC/Integer/Type.hs b/libraries/integer-gmp/src/GHC/Integer/Type.hs index 3e563dc5a5..9ed17fc1b1 100644 --- a/libraries/integer-gmp/src/GHC/Integer/Type.hs +++ b/libraries/integer-gmp/src/GHC/Integer/Type.hs @@ -426,7 +426,7 @@ minusInteger x y = inline plusInteger x (inline negateInteger y) -- | Multiply two 'Integer's timesInteger :: Integer -> Integer -> Integer -timesInteger _ (S# 0#) = S# 0# +timesInteger !_ (S# 0#) = S# 0# timesInteger (S# 0#) _ = S# 0# timesInteger x (S# 1#) = x timesInteger (S# 1#) y = y @@ -515,7 +515,7 @@ bitInteger i# -- | Test if /n/-th bit is set. testBitInteger :: Integer -> Int# -> Bool -testBitInteger _ n# | isTrue# (n# <# 0#) = False +testBitInteger !_ n# | isTrue# (n# <# 0#) = False testBitInteger (S# i#) n# | isTrue# (n# <# GMP_LIMB_BITS#) = isTrue# (((uncheckedIShiftL# 1# n#) `andI#` i#) /=# 0#) @@ -614,7 +614,7 @@ xorInteger x y {- S# -} = xorInteger x (unsafePromote y) -- | Bitwise AND operation andInteger :: Integer -> Integer -> Integer -- short-cuts -andInteger (S# 0#) _ = S# 0# +andInteger (S# 0#) !_ = S# 0# andInteger _ (S# 0#) = S# 0# andInteger (S# -1#) y = y andInteger x (S# -1#) = x @@ -646,7 +646,7 @@ unsafePromote x = x quotRemInteger :: Integer -> Integer -> (# Integer, Integer #) quotRemInteger n (S# 1#) = (# n, S# 0# #) quotRemInteger n (S# -1#) = let !q = negateInteger n in (# q, (S# 0#) #) -quotRemInteger _ (S# 0#) = (# S# (quotInt# 0# 0#),S# (remInt# 0# 0#) #) +quotRemInteger !_ (S# 0#) = (# S# (quotInt# 0# 0#),S# (remInt# 0# 0#) #) quotRemInteger (S# 0#) _ = (# S# 0#, S# 0# #) quotRemInteger (S# n#) (S# d#) = case quotRemInt# n# d# of (# q#, r# #) -> (# S# q#, S# r# #) @@ -679,7 +679,7 @@ quotRemInteger n@(S# n#) (Jp# d) -- need to account for (S# minBound) quotInteger :: Integer -> Integer -> Integer quotInteger n (S# 1#) = n quotInteger n (S# -1#) = negateInteger n -quotInteger _ (S# 0#) = S# (quotInt# 0# 0#) +quotInteger !_ (S# 0#) = S# (quotInt# 0# 0#) quotInteger (S# 0#) _ = S# 0# quotInteger (S# n#) (S# d#) = S# (quotInt# n# d#) quotInteger (Jp# n) (S# d#) @@ -699,7 +699,7 @@ quotInteger n d = case inline quotRemInteger n d of (# q, _ #) -> q {-# CONSTANT_FOLDED quotInteger #-} remInteger :: Integer -> Integer -> Integer -remInteger _ (S# 1#) = S# 0# +remInteger !_ (S# 1#) = S# 0# remInteger _ (S# -1#) = S# 0# remInteger _ (S# 0#) = S# (remInt# 0# 0#) remInteger (S# 0#) _ = S# 0# @@ -763,7 +763,7 @@ gcdInteger (Jp# a) (S# b#) -- | Compute least common multiple. lcmInteger :: Integer -> Integer -> Integer -lcmInteger (S# 0#) _ = S# 0# +lcmInteger (S# 0#) !_ = S# 0# lcmInteger (S# 1#) b = absInteger b lcmInteger (S# -1#) b = absInteger b lcmInteger _ (S# 0#) = S# 0# @@ -998,7 +998,7 @@ sqrBigNat x sqrBigNat x = timesBigNat x x -- TODO: mpn_sqr timesBigNatWord :: BigNat -> GmpLimb# -> BigNat -timesBigNatWord _ 0## = zeroBigNat +timesBigNatWord !_ 0## = zeroBigNat timesBigNatWord x 1## = x timesBigNatWord x@(BN# x#) y# | isTrue# (nx# ==# 1#) = @@ -1231,7 +1231,7 @@ remBigNat n@(BN# nba#) d@(BN# dba#) -- | Note: Result of div/0 undefined quotRemBigNatWord :: BigNat -> GmpLimb# -> (# BigNat, GmpLimb# #) -quotRemBigNatWord _ 0## = (# nullBigNat, 0## #) +quotRemBigNatWord !_ 0## = (# nullBigNat, 0## #) quotRemBigNatWord n 1## = (# n, 0## #) quotRemBigNatWord n@(BN# nba#) d# = case compareBigNatWord n d# of LT -> (# zeroBigNat, bigNatToWord n #) |