diff options
author | Sylvain Henry <sylvain@haskus.fr> | 2020-07-28 11:30:44 +0200 |
---|---|---|
committer | Marge Bot <ben+marge-bot@smart-cactus.org> | 2020-07-29 15:09:02 -0400 |
commit | 96c31ea1f0303ebabc59edccff2e88444fe02722 (patch) | |
tree | b3da29f2cfdd29b1f1e479be215e6478cedb3e82 /libraries | |
parent | e3db4b4c5b7f5d2a62ebd88e174fca07d04c4e18 (diff) | |
download | haskell-96c31ea1f0303ebabc59edccff2e88444fe02722.tar.gz |
Fix bug in Natural multiplication (fix #18509)
A bug was lingering in Natural multiplication (inverting two limbs)
despite QuickCheck tests used during the development leading to wrong
results (independently of the selected backend).
Diffstat (limited to 'libraries')
-rw-r--r-- | libraries/ghc-bignum/src/GHC/Num/BigNat.hs | 4 | ||||
-rw-r--r-- | libraries/ghc-bignum/src/GHC/Num/Natural.hs | 4 | ||||
-rw-r--r-- | libraries/ghc-bignum/src/GHC/Num/WordArray.hs | 10 |
3 files changed, 10 insertions, 8 deletions
diff --git a/libraries/ghc-bignum/src/GHC/Num/BigNat.hs b/libraries/ghc-bignum/src/GHC/Num/BigNat.hs index 20a227f099..4aeedafc9d 100644 --- a/libraries/ghc-bignum/src/GHC/Num/BigNat.hs +++ b/libraries/ghc-bignum/src/GHC/Num/BigNat.hs @@ -228,8 +228,8 @@ bigNatToWordList bn = go (bigNatSize# bn) -- | Convert two Word# (most-significant first) into a BigNat bigNatFromWord2# :: Word# -> Word# -> BigNat# bigNatFromWord2# 0## 0## = bigNatZero# (# #) -bigNatFromWord2# 0## n = bigNatFromWord# n -bigNatFromWord2# w1 w2 = wordArrayFromWord2# w1 w2 +bigNatFromWord2# 0## l = bigNatFromWord# l +bigNatFromWord2# h l = wordArrayFromWord2# h l -- | Convert a BigNat into a Word# bigNatToWord# :: BigNat# -> Word# diff --git a/libraries/ghc-bignum/src/GHC/Num/Natural.hs b/libraries/ghc-bignum/src/GHC/Num/Natural.hs index ac35b65522..62e9f33e1c 100644 --- a/libraries/ghc-bignum/src/GHC/Num/Natural.hs +++ b/libraries/ghc-bignum/src/GHC/Num/Natural.hs @@ -86,8 +86,8 @@ naturalFromWord# x = NS x -- | Convert two Word# (most-significant first) into a Natural naturalFromWord2# :: Word# -> Word# -> Natural naturalFromWord2# 0## 0## = naturalZero -naturalFromWord2# 0## n = NS n -naturalFromWord2# w1 w2 = NB (bigNatFromWord2# w2 w1) +naturalFromWord2# 0## l = NS l +naturalFromWord2# h l = NB (bigNatFromWord2# h l) -- | Create a Natural from a Word naturalFromWord :: Word -> Natural diff --git a/libraries/ghc-bignum/src/GHC/Num/WordArray.hs b/libraries/ghc-bignum/src/GHC/Num/WordArray.hs index 78c450b55e..9b98f74293 100644 --- a/libraries/ghc-bignum/src/GHC/Num/WordArray.hs +++ b/libraries/ghc-bignum/src/GHC/Num/WordArray.hs @@ -121,12 +121,14 @@ withNewWordArrayTrimedMaybe# sz act = case runRW# io of (# _, a #) -> a -- | Create a WordArray# from two Word# -- --- `byteArrayFromWord2# msw lsw = lsw:msw` +-- `wordArrayFromWord2# h l +-- where h is the most significant word +-- l is the least significant word wordArrayFromWord2# :: Word# -> Word# -> WordArray# -wordArrayFromWord2# msw lsw = +wordArrayFromWord2# h l = withNewWordArray# 2# \mwa s -> - case mwaWrite# mwa 0# lsw s of - s -> mwaWrite# mwa 1# msw s + case mwaWrite# mwa 0# l s of + s -> mwaWrite# mwa 1# h s -- | Create a WordArray# from one Word# wordArrayFromWord# :: Word# -> WordArray# |