summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbuggymcbugfix <4444-buggymcbugfix@users.noreply.gitlab.haskell.org>2020-05-16 21:55:57 +0300
committerMarge Bot <ben+marge-bot@smart-cactus.org>2020-05-21 12:18:06 -0400
commite748006355d85fcddd17ba206873b0051219abb1 (patch)
tree3f610323e1656a24a02cd6e59d492883e19b37c8
parentb552e53136abfd6d728563338df99bf899d16139 (diff)
downloadhaskell-e748006355d85fcddd17ba206873b0051219abb1.tar.gz
Piggyback on Enum Word methods for Word64
If we are on a 64 bit platform, we can use the efficient Enum Word methods for the Enum Word64 instance.
-rw-r--r--libraries/base/GHC/Word.hs42
1 files changed, 38 insertions, 4 deletions
diff --git a/libraries/base/GHC/Word.hs b/libraries/base/GHC/Word.hs
index d68fd464b9..81415b8872 100644
--- a/libraries/base/GHC/Word.hs
+++ b/libraries/base/GHC/Word.hs
@@ -892,10 +892,44 @@ instance Enum Word64 where
| x <= fromIntegral (maxBound::Int)
= I# (word2Int# x#)
| otherwise = fromEnumError "Word64" x
- enumFrom = integralEnumFrom
- enumFromThen = integralEnumFromThen
- enumFromTo = integralEnumFromTo
- enumFromThenTo = integralEnumFromThenTo
+
+#if WORD_SIZE_IN_BITS < 64
+ enumFrom = integralEnumFrom
+ enumFromThen = integralEnumFromThen
+ enumFromTo = integralEnumFromTo
+ enumFromThenTo = integralEnumFromThenTo
+#else
+ -- See Note [Stable Unfolding for list producers] in GHC.Enum
+ {-# INLINABLE enumFrom #-}
+ enumFrom w
+ = map wordToWord64
+ $ enumFrom (word64ToWord w)
+
+ -- See Note [Stable Unfolding for list producers] in GHC.Enum
+ {-# INLINABLE enumFromThen #-}
+ enumFromThen w s
+ = map wordToWord64
+ $ enumFromThen (word64ToWord w) (word64ToWord s)
+
+ -- See Note [Stable Unfolding for list producers] in GHC.Enum
+ {-# INLINABLE enumFromTo #-}
+ enumFromTo w1 w2
+ = map wordToWord64
+ $ enumFromTo (word64ToWord w1) (word64ToWord w2)
+
+ -- See Note [Stable Unfolding for list producers] in GHC.Enum
+ {-# INLINABLE enumFromThenTo #-}
+ enumFromThenTo w1 s w2
+ = map wordToWord64
+ $ enumFromThenTo (word64ToWord w1) (word64ToWord s) (word64ToWord w2)
+
+word64ToWord :: Word64 -> Word
+word64ToWord (W64# w#) = (W# w#)
+
+wordToWord64 :: Word -> Word64
+wordToWord64 (W# w#) = (W64# w#)
+#endif
+
-- | @since 2.01
instance Integral Word64 where